我在Aviv Ben-Yosef的blog post:
中找到了这个解决方案angular.module('app').controller('TheCtrl', function($scope, NotifyingService) {
// ... stuff ...
NotifyingService.subscribe($scope, function somethingChanged() {
// Handle notification
});
});
angular.module('app').factory('NotifyingService', function($rootScope) {
return {
subscribe: function(scope, callback) {
var handler = $rootScope.$on('notifying-service-event', callback);
scope.$on('$destroy', handler);
},
notify: function() {
$rootScope.$emit('notifying-service-event');
}
};
});
我正在考虑这样做:jsfiddle
angular.module('app').factory('NotifyingService', function() {
var handlers = {
list: []
};
return {
subscribe: function(callback) {
handlers.list.push(callback)
},
notify: function() {
handlers.list.forEach(function(handler) {
handler();
});
}
};
});
已编辑:我的目标是将更改发送到同一页面中的控制器。例如,有一个控制器正在与用户做某事,然后它会每次将结果通知给同一页面上的其他控制器。我不需要具备以下功能:取消订阅处理程序,区分每次触发哪个处理程序。
我的解决方案似乎非常简单,我没有发现任何人在互联网上使用它,所以我觉得它应该有问题(内存问题?)。
请指出我的解决方案中的缺陷(如果复杂,请使用资源。例如内存)。我想知道的是,这个解决方案是否合适。
如果我的解决方案很好,请告诉我,或比较两种解决方案的优缺点。
感谢@Daniel Beck。他指出,一旦控制器超出范围,我的解决方案确实需要一种方法/函数来删除处理程序,否则内存泄漏。我相信这是我解决方案的主要缺陷。
答案 0 :(得分:1)
也许我错过了一些明显的东西 - 我相信如果有的话,有人会指出这一点 - 但在我看来,第一个(来自博客文章)的唯一优势就是你当你完成它时,不必记住毁掉$on
观察者。它的主要缺点是服务为其所有$emit
使用单个事件名称 - 如果您在两个不同的控制器中使用此服务,则每次都会触发它们;没有办法区分你实际想要触发的处理程序。
您的版本共享该缺陷,并且还无法删除不需要的处理程序 - 它似乎只支持在调用notify
时运行每个回调列表。这正是$rootScope.$emit
已经完成的事情。
我认为你们两个都有点重新发明轮子。