Angularjs pubsub vs $ broadcast

has*_*sin 32 javascript publish-subscribe 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;
   }
}
Run Code Online (Sandbox Code Playgroud)

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

替代方案只是一种缓存事件类型和回调的服务,并直接调用它们.这要求您清理订阅以避免泄漏.

我的问题是,对于$ broadcast/$范式的动机,我有什么遗漏吗?或者在更传统的pubsub上使用它有什么好处?

如果我对自己的问题不够清楚,请告诉我,谢谢你的时间.

Bri*_*sio 18

我不认为你错过任何东西.您已成功概述了每种方法的优缺点.

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

发布/订阅方法更直接.只有订阅者才能获得事件,因此不会让系统中的每个范围都能使其生效.但是,它更复杂,因为您需要使用回调处理程序编写服务,并且必须记住取消订阅.在我看来,记住取消订阅是非常巨大的.如果你没有做到这一点,你会得到内存泄漏.在3个月内出现问题之前你不会知道它.

我可以看出内置方法的原因$broadcast.