Как: Служба AngularJS или другой компонент мгновенно запускаются при загрузке модуля?

0

Привет, читатель, и Angularistics,

Я задавался вопросом о рецепте создания службы, поставщика или любого другого углового компонента, который мгновенно создает экземпляр ONCE, когда модуль загружается.

Например, у меня есть модуль под названием "utils". У меня есть модуль приложения, называемый "myApp", который зависит от "utils",

У меня есть служба в модуле utils, называемая "intervalRegister", которая содержит метод регистрации для аффилированного приложения api для приложения.

мы должны использовать эту услугу каждый раз, когда мы хотим зарегистрировать опрос, но эта услуга решительно останавливает все опросы, когда окно потеряло фокус - чтобы избежать нежелательного сетевого трафика.

В настоящее время этот "intervalRegister" создается методом "utils", но я не считаю его лучшим решением.

Теги:
web-frontend
web-services

1 ответ

0

Я думаю, что добавление его в метод запуска в порядке, но в качестве альтернативы вы можете добавить контроллер, который использует вашу службу 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>
  • 0
    Эта логика была первой, которую я попробовал. Моя проблема с этим: Служба не создается сразу после того, как модуль сделал. Контроллеры должны регистрировать только обратный вызов - функцию, которую нужно запустить - с параметром - время повторения. Но таким образом, когда контроллер уничтожит (например, при выходе из маршрута) интервал будет недоступен. Хотя в сервисе регистрации я буду иметь дело с логикой, когда окно не сфокусировано, я не буду запускать эти обратные вызовы, но оставлю их в зарегистрированном материале. PS: спасибо за ваш ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню