我有一个指令,在他的控制器中包含一个观察者,例如:
$rootScope.$on('broad1', (event, args) => {
doSomething()
});
然后,我用$ state.go重新加载页面的包含指令的部分。而且不幸的是,即使我的指令被重新初始化了,当然也没有重复,但仍会创建一个新的观察程序并将其添加到我的rootscope中。 (我已经知道,当将watcher附加到rootscope时,它不会被破坏,而从DOM中删除了该指令)
因此,当我广播“ broad1”时,观察者将执行n次(对应于n次先前的重新加载)。为什么?
答案 0 :(得分:1)
在指令中使用AngularJS事件总线时,事件监听器应该放置在本地范围上。活动应从$rootScope
广播:
app.directive("myDirective", function() {
return {
link: postLink,
};
function postLink(scope,elem,attrs) {
scope.$on('broad1', (event, args) => {
doSomething()
});
scope.broadcast = function(data) {
scope.$root.$broadcast("broad1", data);
};
};
})
当作用域被破坏时,事件监听器将被自动删除。
有关更多信息,请参见
请记住,AngularJS事件总线效率低下且已过时。尽可能使用更直接的方式将事件传达给接收者。
从文档中:
仅将。$ broadcast()和。$ on()用于原子事件
与整个应用程序全局相关的事件(例如,用户身份验证或应用程序关闭)。如果您想要特定于模块,服务或窗口小部件的事件,则应考虑使用服务,指令控制器或第三方库
- 直接注入服务和调用方法对于直接通信也很有用
- 指令可以通过指令控制器直接相互通信
另请参阅
答案 1 :(得分:0)
感谢您的积极性和洞察力,我已经通过使用$ scope.on [...]和$ rootscope.broadcast [...]修复了它。 另一方面,“服务方式”也是不错的选择。
今天愉快。