Почему сервис не получает события

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

$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 */ );
    }


})
Другие вопросы по тегам