En utilisant setInterval dans l'usine angularjs

J'essayais le code donné dans les documents angularjs (donnés ici: http://jsfiddle.net/zGqB8/ ) Il implémente simplement une usine de temps et utilise $ timeout pour mettre à jour l'objet de temps après chaque seconde.

angular.module('timeApp', []) .factory('time', function($timeout) { var time = {}; (function tick () { time.now = new Date().toString(); $timeout(tick, 1000); // how to do it using setInterval() ? })(); return time; }); 

Comment le faire en utilisant la fonction setInterval () au lieu de $ timeout ()? Je sais qu'il faut utiliser la scope.$apply() pour entrer dans le contexte d'exécution angulaire, mais comment cela fonctionnerait-il dans une fonction d'usine? Je veux dire, dans un contrôleur, nous avons une portée, mais nous n'avons pas de portée dans une fonction d'usine?

Vous pouvez utiliser $timeout comme intervalle.

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

Si la vue est détruite, vous pouvez la détruire en écoutant sur $destroy :

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

Mettre à jour

Angular a mis en place une fonctionnalité d'intervalle $ dans la version 1.2 – http://docs.angularjs.org/api/ng.$interval


Exemple de legs ci-dessous, méfiez-vous, sauf si vous utilisez une version antérieure à 1.2.

Une implémentation setInterval dans Angular –

J'ai créé une usine nommée timeFunctions, qui expose $ setInterval et $ clearInterval.

Notez que chaque fois que j'ai besoin de modifier la portée dans une usine, je l'ai passé. Je ne sais pas si cela répond à la «manière angulaire» de faire les choses, mais ça marche bien.

 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 ] ); } } } ]); 

Exemple d'utilisation:

 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 ); } } ]); 

Pourriez-vous appeler une méthode JavaScript normale, puis, dans cette méthode, enveloppez-vous le code Angulaire avec une application $?

Exemple

 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(); }); }; 

Le dernier candidat à la version (1.2.0 rc3) a un support d' intervalle . Voir changelog