我一直在阅读通过Angularjs传递的事件,我不相信使用$broadcast是个好主意。
像这个one这样的博客主张习惯$on,尽管它“感觉有点过火了”。
我的困惑是,实现使用范围的深度优先遍历并查找订阅者,这使得事件的速度取决于树结构。下面是一些以角度表示的代码:
// 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;
}
}此外,您似乎可以使用这些方法攻击依赖项注入。
另一种方法就是缓存事件类型和回调并直接调用它们的服务。这要求您清理订阅以避免泄漏。
我的问题是,对于$ about /$on范式的动机,我是否遗漏了什么?或者在传统的公共场合使用它有什么好处?
如果我对我的问题不够清楚,请告诉我,谢谢你的时间。
发布于 2014-02-07 22:34:02
我不认为你错过了什么。您已经成功地概述了每种方法的优缺点。
$broadcast/$on方法不要求您取消订阅,但是它向所有作用域广播的效率并不高。它的进入门槛也很低。您不需要注入任何服务,也不需要创建它们。他们向每个人广播,所以这是一个更简单的方法。
酒吧/分店的方式要直接得多。只有订阅者才能获得事件,因此它并不能在系统中的每个范围内运行。但是,它更复杂,因为您需要使用回调处理程序编写服务,并且必须记住取消订阅。在我看来,记得取消订阅是非常重要的。如果你做得不对,你就会有内存泄漏。三个月后你才会知道这是个问题。
我明白为什么内置的方法是$broadcast。
发布于 2015-03-05 20:11:43
我在看同样的问题。特别是如何允许服务在不访问$rootScope的情况下广播和订阅事件(原因如下)。我从这里使用了非常优秀的js信号实现:http://millermedeiros.github.io/js-signals/,并将它包装成一个角服务。
github要点:https://gist.github.com/anonymous/b552c7fafa77427e6d06
https://stackoverflow.com/questions/21638563
复制相似问题