为什么服务不接收事件
why a service does not receive events
我有一些在控制器中运行的代码。我重构了该功能并将其移至服务中。该代码有一个事件侦听器:
$rootScope.$on( .....)
这在控制器中时被捕获,但在服务中时未捕获该事件。我已经尝试使用 $rootScope.$broadcast()
和 $rootScope.$emit()
来发出事件信号,但都没有被捕获到服务中。
服务代码没有什么特别之处:
heartbeatService.$inject = [ '$rootScope', 'vcapChanService', 'eventService', 'logger' ];
function heartbeatService( $rootScope, vcapChanService, eventService, logger ) {
//....
}
问题:如何获取服务以捕获根作用域上的事件?
使用更多信息进行编辑:该事件是从另一项服务发出信号的。并且此事件被其他控制器捕获,但未被其他服务捕获。我已经尝试了 service/factory、emit/broadcast 等的所有变体,其中 none 有效。该服务只是没有捕捉到事件,但在所有其他方面都完美无缺。
你可以在它们之间建立服务桥梁并使用 watch
喜欢
// 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 */ );
}
})
我有一些在控制器中运行的代码。我重构了该功能并将其移至服务中。该代码有一个事件侦听器:
$rootScope.$on( .....)
这在控制器中时被捕获,但在服务中时未捕获该事件。我已经尝试使用 $rootScope.$broadcast()
和 $rootScope.$emit()
来发出事件信号,但都没有被捕获到服务中。
服务代码没有什么特别之处:
heartbeatService.$inject = [ '$rootScope', 'vcapChanService', 'eventService', 'logger' ];
function heartbeatService( $rootScope, vcapChanService, eventService, logger ) {
//....
}
问题:如何获取服务以捕获根作用域上的事件?
使用更多信息进行编辑:该事件是从另一项服务发出信号的。并且此事件被其他控制器捕获,但未被其他服务捕获。我已经尝试了 service/factory、emit/broadcast 等的所有变体,其中 none 有效。该服务只是没有捕捉到事件,但在所有其他方面都完美无缺。
你可以在它们之间建立服务桥梁并使用 watch
喜欢
// 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 */ );
}
})