角度$广播和$昂贵吗?

时间:2013-11-27 15:07:46

标签: javascript angularjs events javascript-events broadcast

我被告知使用角度事件可能很昂贵(我一直无法验证)

$broadcast$on的任何调用都应该与工厂或服务“包装”,以注入相应的组件以保持性能?

我宁愿使用$on并直接监听被触发的事件,而不是创建一个工厂,它本质上只是在收到事件时注册要调用的函数 - 让我们称之为调度程序。

请注意,不只是一个组件(指令)收听'some-event',会有​​各种组件收听此事件。

示例调度员:

angular.module('app').factory('dispatcher', ['$rootScope', function ($rootScope) {

    var registeredFns = [ ];

    $rootScope.$on('some-event', function (evt, msg) { 
        _.each(registeredFns, function (fn) {
            fn.apply(null, msg);
        });
    });

    return {
        onSomeEvent: function (fn) {
            registeredFns.push(fn);
        }
    };
});

将它注入我需要它的地方 - 也许是一个指令,也许是一个无关紧要的控制器。

1 个答案:

答案 0 :(得分:6)

他们根本不贵......但如果他们被滥用(如同生活中的其他任何事情一样),他们可能可能昂贵 - 这听起来像是一个开始一个好笑话!)

了解这里实际发生的事情非常重要,而code实际上非常简单。如果你调用$ emit(),它只会在已注册的侦听器数组中执行for()循环并调用每个侦听器。它会在您首次调用它的范围内执行此操作,然后再行走" up"每个父母直到它击中$ rootScope。

还有一些额外的代码来处理像stopPropagation这样的事情,但除此之外就是它。

$ broadcast做了类似的事情,但方向相反:它为()循环执行此操作,然后遍历每个范围。这是一个非常重要的区别,因为如果你做$rootScope.$broadcast()并且你有很多ngRepeats和指令浮出水面,那么你可能会做出比预期更多的工作 - 即使这些范围都没有听取这个事件,Angular仍然需要通过它们来解决这个问题。

如果您想在jsPerf中进行尽可能最快的测试,那么您最快的用例就是使用$rootScope.$emit()$rootScope.$on()。这将为您提供基本消息传递的单一范围测试,您可以从那里开始。