Я столкнулся с следующей проблемой:
В моем приложении AngularJS у меня есть служба, которая включает данные и функцию, которая обновляет их
angular.module('testService', ['ui.router'])
.factory('testService', function($http) {
var service = {};
var _baseUrl = 'http://127.0.0.1:8000/api/v1/test/';
service.orders = {created: 0, approved: 0};
/*
* get number of unprocessed orders
*/
service.updateNOrders = function(){
var tableName = 'orders?stats=true';
$http({
method: 'GET',
url: _baseUrl + tableName,
}).success(function(data){
service.orders = data;
console.log(data);
return;
}).error(function(err){
alert(JSON.stringify(err));
return;
})
}
});
Я могу ввести эту службу в директиву и вызвать функцию updateNOrders
для обновления данных из директивы.
Тем не менее, я хочу, чтобы служба вызывала эту функцию каждые n
секунд.
Служба разделяется несколькими директивами, и вместо каждой директивы, заботясь об обновлении данных, я хотел бы, чтобы служба выполняла ее сама.
Я пробовал что-то вроде:
angular.module('testService', ['ui.router'])
.factory('testService', function($http, $q, $rootScope, $interval) {
$interval(console.log('test'),1000);
/*
rest of the code
*/
});
но это не работает.
Итак - Можно ли вызвать функцию updateNOrders
внутри testService
каждую минуту или около того?
Создание сервиса с побочным эффектом - плохая идея. Лучше создать службу с помощью метода, который устанавливает ваш интервал с обратным вызовом. Затем вы можете ввести свою услугу в обратный вызов (выполнить обратный вызов вызовов только один раз):
angular.module('testService', ['ui.router'])
.factory('testService', ['$interval', function($interval) {
var service = {};
service.doPeriodicAjaxRequest = doPeriodicAjaxRequest;
function doPeriodicAjaxRequest() {
$interval(yourCode, ...);
}
return service;
}]);
Затем:
angular.module('', [])
.run(['testService', function (testService) {
testService.doPeriodicAjaxRequest();
}]);
Почему вы не вызываете функцию обслуживания с контроллера в определенный промежуток времени.
$interval(testService.functionName,1000);