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

时间:2015-01-24 10:19:31

标签: javascript angularjs

我的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 :( });

出于某种原因,我的听众被多次打电话(确切地说是2倍)。我觉得在某个地方,我建在第二个rootScope或其他东西。我正在调试我的应用程序,但这就像在大海捞针中找到针。

此主题尝试解决类似的问题:AngularJs broadcast repeating execution too many times。它建议只使用$ scope,在我的特定情况下对我不起作用。广播的事件从未传达给听众。

我的问题是,如果有人知道为什么会发生这种情况?也许我正在做一个我不知道的愚蠢的错误。抓住一次事件我只发了一次听起来不对。

提前致谢

2 个答案:

答案 0 :(得分:6)

使用

$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/的Eventbus工厂的小提琴 有时好的旧观察者模式也可以正常工作:http://jsfiddle.net/b742qdpz/如果在服务中观察价值需要很多开销

答案 1 :(得分:4)

收紧你的模块&范围

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

通过 locality 我的意思是,尽量不要使用全局变量。通常情况下,当您从$rootScope而非$scope - 更多本地

Angular的作用(在果壳中)

Angular有一种特殊的事件订阅绑定方式,它基于范围而不同。

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

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

TL; DR

每次加载视图时 - 有效构建一个new控制器 - 毫无疑问,每个订阅都会为另一个监听器连接。

希望这有帮助!