为什么服务不接收事件

时间:2016-10-14 21:21:54

标签: angularjs angularjs-service angularjs-factory angularjs-events

我有一些在控制器中工作的代码。我重构并将该功能转移到服务中。代码有一个事件监听器:

Linking

当它在控​​制器中时被捕获,但在服务中没有捕获事件。我尝试使用$rootScope.$on( .....) $rootScope.$broadcast()来表示该事件,但两者都没有被捕获。

服务代码没有什么特别之处:

$rootScope.$emit()

问题:如何获取服务以捕获根范围上的事件?

使用更多信息进行编辑:该事件通过其他服务发出信号。此事件在其他控制器中被捕获,但不会被其他服务捕获。我已经尝试了服务/工厂,发射/广播等所有变体,但它们都不起作用。该服务只是没有捕获事件,但在所有其他方面完美的工作。

1 个答案:

答案 0 :(得分: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 */ );
    }


})
相关问题