Почему сервис не получает события
У меня есть код, который работал в контроллере. Я реорганизовал и перенес эту функциональность в сервис. В коде был прослушиватель событий:
$rootScope.$on( .....)
Это было обнаружено, когда оно было в контроллере, но не перехватывало событие в службе. Я пытался использовать $rootScope.$broadcast()
а также $rootScope.$emit()
сигнализировать о событии, но ни один не попал в службу.
В сервисном коде нет ничего особенного:
heartbeatService.$inject = [ '$rootScope', 'vcapChanService', 'eventService', 'logger' ];
function heartbeatService( $rootScope, vcapChanService, eventService, logger ) {
//....
}
Вопрос: как мне получить сервис для перехвата событий в корневой области?
Изменить с дополнительной информацией: Событие сигнализируется из другого сервиса. И это событие перехватывается другими контроллерами, но НЕ перехватывается другим сервисом. Я перепробовал все варианты обслуживания / фабрики, передачи / трансляции и т. Д., И ни один из них не работает. Сервис просто не ловит событие, но во всех остальных отношениях работает отлично.
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 */ );
}
})