AngularJS:在rootScope上广播/发出的事件多次发生

AngularJS: Events broadcasted/emitted on rootScope occur multiple times

本文关键字:事件 rootScope 广播 AngularJS      更新时间:2023-09-26

我的 Angular 应用程序已经相当大了,我正在使用 rootScope 在指令和控制器之间进行通信。

Directive 1
scope.$root.$broadcast('some:event');
Controller 1
$rootScope.$on('some:event', function() { I get called multiple times :( });
$scope.$on('some:event', function() { I am not getting called at all :( });

出于某种原因,我的听众被多次调用(确切地说是 2x)。我有一种感觉,在某个地方,我构建了第二个rootScope或其他东西。我目前正在调试我的应用程序,但这就像大海捞针一样。

这个线程试图解决一个类似的问题:AngularJs 广播重复执行的次数太多。它建议仅使用$scope,这在我的特定情况下对我不起作用。广播的事件永远不会到达听众。

我的问题是,如果有人知道为什么会发生这种情况?也许我正在犯一个我不知道的愚蠢错误。两次捕获我只发送一次的事件听起来确实是错误的。

提前致谢

使用

$rootScope.$emit('some:event') ;

因为它向上,根范围是顶层

var myListener = $rootScope.$on('some:event', function (event, data) { });
$scope.$on('$destroy', myListener); 

不要忘记在销毁时取消注册,并且您在同一级别上具有总线通信

编辑:对于您的问题:也许其他一些听众阻止它像这样进一步冒泡:。

 $scope.$on('some:event', function (event, data) {
    event.stopPropagation();
 });

您的听众收到可重复时间的原因可能是您发送了多次。 使用事件发送时间串进行测试,看看它是否相同

这是我使用的事件总线工厂的小提琴 http://jsfiddle.net/navqtaoj/2/有时,好的旧观察者模式也可以正常工作:http://jsfiddle.net/b742qdpz/如果监视服务中的值会产生很大的开销

收紧你的模块和范围

很多时候,当您遇到一个事件的多次调度时 - 或者更具体地说,当您调用多个处理程序时,您的模块需要更多地利用局部性

的意思是,尽量不要使用全局变量。这可以(并且通常确实)发生,通常,当您从$rootScope而不是$scope收听/触发事件时 - 这更本地化

Angular 的作用(简而言之)

Angular 有一种特殊的事件订阅绑定方式,根据范围而有所不同。

如果使用使用易腐范围的控制器订阅事件,则当控制器关闭时,Angular 会自动取消订阅每个事件。

但是,当使用$rootScope订阅时,Angular 不会坚持分离这些订阅绑定。 所以...

博士

每次加载视图(有效地构造new控制器)时,无疑都会为每个订阅连接另一个侦听器。

希望这有帮助!