2015-08-28 2 views
0

Привет читатель, и Angularistics,Практическое руководство. Угловой сервис или другой компонент, когда модуль загружается?

мне было интересно о рецепте создания службы или поставщика или любой другой угловой компонент, который мгновенно инстанцирует РАЗ при загрузке модуля.

E.g. У меня есть модуль под названием «Utils» У меня есть модуль приложение под названием «MYAPP», который зависит от «Utils»

У меня есть служба в модуле Utils называется «intervalRegister», который содержит метод регистра для приложений для опроса api.

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

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

ответ

0

Я думаю, что добавление его в метод запуска в порядке, но в качестве альтернативы вы можете добавить контроллер, который использует ваш сервис interval.

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

Я не знаю другого способа автоматического запуска интервала, и я не видел его в Google.

Пожалуйста, взгляните на демо внизу или в этом jsfiddle.

angular.module('demoApp', ['utils']) 
 
\t .controller('pollController', PollController) 
 
\t .controller('mainController', MainController); 
 

 
angular.module('utils', []) 
 
    //.run(['intervalTimer', function(intervalTimer){}]) 
 
\t .service('intervalTimer', IntervalTimer) 
 
\t 
 

 
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() { 
 
\t 
 
} 
 

 
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!' 
 
    \t \t \t $log.log('poll callback no. ' + this.pollCounter + ' called!'); 
 
       vm.messages += 'poll callback no. ' 
 
        + this.pollCounter + ' called!' + '\r\n'; 
 
    \t \t \t } 
 
     }; 
 
     
 
    \t 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

Эта логика была первой, я пытался. Моя проблема с этим: Услуга не создается сразу после того, как модуль был выполнен. Контроллеры должны регистрировать только обратный вызов - функцию, которую нужно запустить - с параметром - время повторения. Но таким образом, когда контроллер уничтожил (например, при выходе с маршрута), промежуточные вещи будут недоступны. Хотя в службе регистрации я имел дело с логикой, когда окно не сфокусировано, я бы не запускал эти обратные вызовы, но оставил их в зарегистрированном материале. p.s .: спасибо за ур ответ –

Смежные вопросы