Javascript Angularjs pubsub vs$广播

Javascript Angularjs pubsub vs$广播,javascript,angularjs,publish-subscribe,Javascript,Angularjs,Publish Subscribe,我一直在阅读Angularjs中的事件传递,我不相信使用$broadcast是个好主意 像这样的博客提倡习惯于使用$on,尽管这“感觉太过分了” 我的困惑是,实现使用深度优先遍历作用域并查找订阅者,这使得事件的速度取决于树结构。 以下是angular中的一些代码: // Insanity Warning: scope depth-first traversal // yes, this code is a bit crazy, but it works and we have tests to

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

像这样的博客提倡习惯于使用$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;
   }
}
此外,您似乎能够使用这些方法破解依赖项注入

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

我的问题是,关于$broadcast/$on范例的动机,我有什么遗漏吗?或者使用它比使用更传统的pubsub有什么好处


如果我的问题不够清楚,请告诉我,谢谢你抽出时间。

我不认为你遗漏了什么。您已经成功地概述了每种方法的优缺点

$broadcast
/
$on
方法不需要您取消订阅,但它的效率并不高,因为它可以向所有作用域进行广播。它的进入门槛也很低。您不需要注入任何服务,也不需要创建它们。他们向每个人广播,所以这是一种更简单的方法

pub/sub方法更直接。只有订阅者才能获得事件,因此它不会进入系统中的每个作用域使其工作。但是,它更复杂,因为您需要使用回调处理程序编写服务,并且必须记住取消订阅。在我看来,记得取消订阅是相当巨大的。如果你做得不对,你就会出现内存泄漏。直到3个月后问题出现,你才会知道


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

我也在研究这个问题。特别是如何允许服务在不访问$rootScope的情况下广播和订阅事件(由于一些原因不好)。 我在这里使用了非常优秀的js信号实现: 把它包成一个有角度的服务


github要点:这是一个很好的问题,谢谢你的提问。我想知道是否有办法自动取消订阅。如果发布/订阅模型与angular集成,您可以在
$destroy
上自动取消订阅。控制器和指令通常对应于一个作用域,并且可以以一种相当
1::1
的方式取消对其销毁的订阅。服务/工厂/提供者不太容易自动化,但通常它们都是单例的。您可以这样做,但这样您就可以将作用域传递给服务。这似乎不是最佳实践。就我个人而言,将
$rootScope
传递到服务中并没有什么大问题。我理解内心的反应,但我内心的实用主义者说“为什么不呢?”。传递
$rootScope
是不够的。这允许您在销毁$rootScope时销毁所有pub sub,但您需要传入单个
$scope
对象。不这样做的原因是因为服务应该与层次结构无关。在这种情况下,这样做还是很安全的,但我喜欢它作为一条坚定的规则。
$broadcast
不一定向所有人“广播”。它只向作用域的子作用域发送事件
$rootScope.$broadcast
将发送给“所有人”,但控制器的
$scope.$broadcast
将只发送给控制器和该控制器中包含的指令作用域。