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