using setInterval in angularjs factory using setInterval in angularjs factory angularjs angularjs

using setInterval in angularjs factory


You can use $timeout as an interval.

var myIntervalFunction = function() {    cancelRefresh = $timeout(function myFunction() {        // do something        cancelRefresh = $timeout(myIntervalFunction, 60000);    },60000);};

If the view is destroyed, you can destroy it with listening on $destroy:

$scope.$on('$destroy', function(e) {        $timeout.cancel(cancelRefresh);});


Update

Angular has implemented an $interval feature in version 1.2 - http://docs.angularjs.org/api/ng.$interval


Legacy example below, disregard unless you're using a version older than 1.2.

A setInterval implementation in Angular -

I've created a factory called timeFunctions, which exposes $setInterval and $clearInterval.

Note that any time I've needed to modify scope in a factory I've passed it in. I am unsure if this meets the "Angular way" of doing things, but it works well.

app.factory('timeFunctions', [  "$timeout",  function timeFunctions($timeout) {    var _intervals = {}, _intervalUID = 1;    return {      $setInterval: function(operation, interval, $scope) {        var _internalId = _intervalUID++;        _intervals[ _internalId ] = $timeout(function intervalOperation(){            operation( $scope || undefined );            _intervals[ _internalId ] = $timeout(intervalOperation, interval);        }, interval);        return _internalId;      },      $clearInterval: function(id) {        return $timeout.cancel( _intervals[ id ] );      }    }  }]);

Example Usage:

app.controller('myController', [  '$scope', 'timeFunctions',  function myController($scope, timeFunctions) {    $scope.startFeature = function() {      // scrollTimeout will store the unique ID for the $setInterval instance      return $scope.scrollTimeout = timeFunctions.$setInterval(scroll, 5000, $scope);      // Function called on interval with scope available      function scroll($scope) {        console.log('scroll', $scope);        $scope.currentPage++;      }    },    $scope.stopFeature = function() {      return timeFunctions.$clearInterval( $scope.scrollTimeout );    }  }]);


Could you call a normal JavaScript method and then within that method wrap the Angular code with an $apply?

Example

timer = setInterval('Repeater()', 50);var Repeater = function () {  // Get Angular scope from a known DOM element  var scope = angular.element(document.getElementById(elem)).scope();  scope.$apply(function () {    scope.SomeOtherFunction();  });};