比较通知服务器更改为控制器AngularJS的方法

时间:2016-04-01 17:52:04

标签: angularjs

我在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。他指出,一旦控制器超出范围,我的解决方案确实需要一种方法/函数来删除处理程序,否则内存泄漏。我相信这是我解决方案的主要缺陷。

1 个答案:

答案 0 :(得分:1)

也许我错过了一些明显的东西 - 我相信如果有的话,有人会指出这一点 - 但在我看来,第一个(来自博客文章)的唯一优势就是你当你完成它时,不必记住毁掉$on观察者。它的主要缺点是服务为其所有$emit使用单个事件名称 - 如果您在两个不同的控制器中使用此服务,则每次都会触发它们;没有办法区分你实际想要触发的处理程序。

您的版本共享该缺陷,并且还无法删除不需要的处理程序 - 它似乎只支持在调用notify时运行每个回调列表。这正是$rootScope.$emit已经完成的事情。

我认为你们两个都有点重新发明轮子。