我的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,在我的特定情况下对我不起作用。广播的事件从未传达给听众。
我的问题是,如果有人知道为什么会发生这种情况?也许我正在做一个我不知道的愚蠢的错误。抓住一次事件我只发了一次听起来不对。
提前致谢
答案 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会自动取消订阅到每个事件。
但是,在使用$rootScope
订阅时,Angular不会坚持要分离这些订阅绑定。所以......
每次加载视图时 - 有效构建一个new
控制器 - 毫无疑问,每个订阅都会为另一个监听器连接。
希望这有帮助!