servicios entre ejemplo diferencia and javascript angularjs javascript-framework

javascript - entre - service and controller in angularjs



usando setInterval en angularjs factory (4)

Estaba probando el código proporcionado en angularjs docs (dado aquí: http://jsfiddle.net/zGqB8/ ). Simplemente implementa una fábrica de tiempo y usa $ timeout para actualizar el objeto de tiempo después de cada segundo.

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

¿Cómo lo haría usando la función setInterval () en lugar de $ timeout ()? Sé que hay que usar scope.$apply() para ingresar al contexto de ejecución angular, pero ¿cómo funcionaría eso en una función de fábrica? Quiero decir, en un controlador, tenemos un alcance, pero no tenemos alcance en una función de fábrica?


¿Podría llamar a un método normal de JavaScript y luego dentro de ese método ajustar el código angular con $ apply?

Ejemplo

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


La última versión candidata (1.2.0 rc3) tiene soporte de interval . Ver changelog


Puede usar $timeout como un intervalo.

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

Si la vista se destruye, puedes destruirla escuchando en $destroy :

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


Actualizar

Angular ha implementado una función $ interval en la versión 1.2 - http://docs.angularjs.org/api/ng.$interval

Ejemplo heredado a continuación, sin tener en cuenta a menos que esté utilizando una versión anterior a 1.2.

Una implementación setInterval en Angular -

Creé una fábrica llamada timeFunctions, que expone $ setInterval y $ clearInterval.

Tenga en cuenta que cada vez que he necesitado modificar el alcance en una fábrica lo he pasado. No estoy seguro de si esto cumple con la "forma angular" de hacer las cosas, pero funciona 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 ] ); } } } ]);

Ejemplo de uso:

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