2

У меня есть код, который работал в контроллере. Я реорганизовал и переместил эту функциональность в службу. Код был слушатель событий:Почему услуга не принимает события

$rootScope.$on(.....) 

Это был пойман, когда он был в контроллере, но не поймать событие, когда в службе. Я пробовал использовать $rootScope.$broadcast() и $rootScope.$emit(), чтобы сигнализировать о событии, но не попал в эту службу.

Там нет ничего особенного кода сервиса:

heartbeatService.$inject = [ '$rootScope', 'vcapChanService', 'eventService', 'logger' ]; 
function heartbeatService($rootScope, vcapChanService, eventService, logger) { 
    //.... 
} 

Вопрос: как я могу получить сервис, чтобы поймать события на корневой сферы?

Редактировать с дополнительной информацией: Событие сигнализируется другой службой. И это событие попадает в другие контроллеры, но НЕ попадает в другую службу. Я пробовал все варианты обслуживания/фабрики, emit/broadcast и т. Д., И никто из них не работает. Сервис просто не поймал событие, но во всех других отношениях отлично работает.

+2

дубликата http://stackoverflow.com/questions/16477123/how-do-i-use-on-in -a-service-in-angular –

+0

В частности, этот ответ в связанном дубликате: http://stackoverflow.com/a/16485628/1078110 –

+0

просто используйте '$ rootScope. $ on (eventName, func ....' Должен работать fine – charlietfl

ответ

1

вы можете сделать обслуживание моста между ними и использованием смотреть

как

// bridge service 
angular.module('app').service('bridge', function() { 
     var self = this; 
     self.events = []; 
     self.fireEvent = function(eventName) { 
      self.events.push(eventName); 
     } 

     self.removeEvent = function(eventName) { 
      var ps = self.events.indexOf(eventName); 
      if (ps != -1) 
       self.events.splice(ps, 1) // to remove the event from events array 
     } 
    }) 
    // firstService 
angular.module('app').service('firstService', function($rootScope, bridge) { 
     // make your business logic here 

     $rootScope.$watchCollection(function() { 
      return bridge.events 
     }, function(values) { 
      var event = 'fileUploaded'; 
      if (values != null && values.indexOf(event)) { 
       // make what you need to when the event fired 
       // then remove the event from the the service 
       bridge.removeEvent(event) 
      } 
     }) 

    }) 
    // secondService 
angular.module('app').service('secondService', function($rootScope, bridge) { 
     var self = this; 
     // make your business logic here 
     self.uploadFile = function(file) { 
      bridge.fireEvent('fileUploaded'); 
     } 
    }) 
    // controller 
angular.module('app').controller('Appcontroller', function(secondService, $scope) { 
    $scope.clickToUpload = function() { 
     secondService.uploadFile(/* file */); 
    } 


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