一尘不染

AngularJS pubsub vs $ broadcast

angularjs

我一直在阅读Angularjs中的事件传递,但我不相信使用$ broadcast是个好主意。

像这样的博客一个倡导者已经习惯了美元,即使它“感觉就像矫枉过正。”

我的困惑是,该实现使用范围的深度优先遍历并寻找订阅者,这使事件的速度取决于树的结构。这是角度代码:

// 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;
   }
}

此外,似乎您可以使用这些方法来破解依赖项注入。

另一种方法是简单地缓存事件类型和回调并直接调用它们的服务。这要求您清理订阅以避免泄漏。

我的问题是,关于$ broadcast / $ on范式的动机是否遗漏了?还是使用它比传统的pubsub有什么好处?

让我知道我是否对我的问题不够清楚,并感谢您的宝贵时间。


阅读 198

收藏
2020-07-04

共1个答案

一尘不染

我认为您没有丢失任何东西。您已成功概述了每种方法的利弊。

$broadcast/
$on方法不要求你退订,但因为它广播到所有范围也并不十分有效。它的进入门槛也很低。您不需要注入任何服务,也不需要创建它们。他们向所有人广播,因此这是一种更简单的方法。

发布/订阅方法更为直接。只有订阅者才能获得事件,因此它并不能进入系统中的每个范围来使其发挥作用。但是,它更为复杂,因为您需要使用回调处理程序来编写服务,并且必须记住要取消订阅。在我看来,退订的记忆是巨大的。如果您做得不好,则会发生内存泄漏。在3个月内出现问题之前,您将不知道。

我可以理解为什么内置方法是$broadcast

2020-07-04