我一直在阅读Angularjs中的事件传递,但我不相信使用$ broadcast是个好主意。
像one这样的博客主张习惯$ on,即使它“感觉像是过分杀伤”。
我的困惑是,该实现使用范围的深度优先遍历并寻找订阅者,这使事件的速度取决于树的结构。
这是一些来自 Angular 的代码:
// Insanity Warning: scope depth-first traversal
// yes, this code is a bit crazy, but it works and we have tests to prove it!
// this piece should be kept in sync with the traversal in $digest
if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) {
while(current !== target && !(next = current.$$nextSibling)) {
current = current.$parent;
}
}
此外,似乎您可以使用这些方法来破解依赖项注入(inject)。
另一种方法是简单地缓存事件类型和回调并直接调用它们的服务。这要求您清理订阅以避免泄漏。
我的问题是,关于$ broadcast/$ on范式的动机是否遗漏了?还是使用它比传统的pubsub有什么好处?
让我知道我是否对我的问题不够清楚,并感谢您的宝贵时间。
最佳答案
我认为您没有丢失任何东西。您已成功概述了每种方法的利弊。$broadcast
/$on
方法不需要您退订,但是由于它广播到所有示波器,因此效率不高。它的进入阈值也很低。您不需要注入(inject)任何服务,也不需要创建它们。他们向所有人广播,因此这是一种更简单的方法。
pub/sub方法更为直接。只有订阅者才能获得事件,因此它并不能进入系统中的每个范围来使其发挥作用。但是,它更加复杂,因为您需要使用回调处理程序编写服务,并且必须记住要取消订阅。在我看来,退订的内存非常巨大。如果您做不到这一点,则会导致内存泄漏。而且直到3个月内出现问题,您才会知道。
我可以看到为什么内置方法是$broadcast
。
关于javascript - AngularJS pubsub vs $ broadcast,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21638563/