Привет, читатель, и Angularistics,
Я задавался вопросом о рецепте создания службы, поставщика или любого другого углового компонента, который мгновенно создает экземпляр ONCE, когда модуль загружается.
Например, у меня есть модуль под названием "utils". У меня есть модуль приложения, называемый "myApp", который зависит от "utils",
У меня есть служба в модуле utils, называемая "intervalRegister", которая содержит метод регистрации для аффилированного приложения api для приложения.
мы должны использовать эту услугу каждый раз, когда мы хотим зарегистрировать опрос, но эта услуга решительно останавливает все опросы, когда окно потеряло фокус - чтобы избежать нежелательного сетевого трафика.
В настоящее время этот "intervalRegister" создается методом "utils", но я не считаю его лучшим решением.
Я думаю, что добавление его в метод запуска в порядке, но в качестве альтернативы вы можете добавить контроллер, который использует вашу службу interval
.
Это, вероятно, лучше, потому что вы также можете добавить логику, связанную с опросом, в этот контроллер.
Я не знаю другого способа автоматического запуска интервала, и я не видел его в Google.
Пожалуйста, просмотрите демо внизу или в этом jsfiddle.
angular.module('demoApp', ['utils'])
.controller('pollController', PollController)
.controller('mainController', MainController);
angular.module('utils', [])
//.run(['intervalTimer', function(intervalTimer){}])
.service('intervalTimer', IntervalTimer)
function IntervalTimer($interval, $log) {
var self = this;
this.count = 0;
this.pollCallbacks = [];
this.addPoll = function(callback, scope) {
return self.pollCallbacks.push({
fn: callback,
scope: scope
});
};
this.timer = function() {
self.count++;
$log.log('hello from interval timer', self.count);
if (self.pollCallbacks.length > 0 ){
angular.forEach(self.pollCallbacks, function(callbackObj) {
//console.log(callbackObj.scope);
callbackObj.fn.call(callbackObj.scope);
});
}
};
$interval(this.timer, 1000);
}
function MainController() {
}
function PollController(intervalTimer, $log) {
var vm = this;
this.messages = '';
this.pollCounter = 0;
this.addPolling = function() {
var callbackObj = {
pollCounter: angular.copy(vm.pollCounter++),
fn: function() {
var msg = 'poll callback no. ' + this.pollCounter + ' called!'
$log.log('poll callback no. ' + this.pollCounter + ' called!');
vm.messages += 'poll callback no. '
+ this.pollCounter + ' called!' + '\r\n';
}
};
vm.pollCounter = intervalTimer.addPoll(callbackObj.fn, callbackObj);
};
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="demoApp" ng-controller="mainController as mainCtrl">
<div ng-controller="pollController as pollCtrl">
<button ng-click="pollCtrl.addPolling()">add poll</button>active polls: {{pollCtrl.pollCounter}} <pre ng-bind="pollCtrl.messages"></pre>
</div>
</div>