我一直在阅读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有什么好处?
让我知道我是否对我的问题不够清楚,并感谢您的宝贵时间。
我认为您没有丢失任何东西。您已成功概述了每种方法的利弊。
该$broadcast/ $on方法不要求你退订,但因为它广播到所有范围也并不十分有效。它的进入门槛也很低。您不需要注入任何服务,也不需要创建它们。他们向所有人广播,因此这是一种更简单的方法。
$broadcast
$on
发布/订阅方法更为直接。只有订阅者才能获得事件,因此它并不能进入系统中的每个范围来使其发挥作用。但是,它更为复杂,因为您需要使用回调处理程序来编写服务,并且必须记住要取消订阅。在我看来,退订的记忆是巨大的。如果您做得不好,则会发生内存泄漏。在3个月内出现问题之前,您将不知道。
我可以理解为什么内置方法是$broadcast。