指令的$ rootScope。$ on事件监听器遗留问题

时间:2019-04-25 15:34:28

标签: angularjs angularjs-directive broadcast rootscope

我有一个指令,在他的控制器中包含一个观察者,例如:

$rootScope.$on('broad1', (event, args) => {
            doSomething()
});

然后,我用$ state.go重新加载页面的包含指令的部分。而且不幸的是,即使我的指令被重新初始化了,当然也没有重复,但仍会创建一个新的观察程序并将其添加到我的rootscope中。 (我已经知道,当将watcher附加到rootscope时,它不会被破坏,而从DOM中删除了该指令)

因此,当我广播“ broad1”时,观察者将执行n次(对应于n次先前的重新加载)。为什么?

2 个答案:

答案 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()用于原子事件

     

与整个应用程序全局相关的事件(例如,用户身份验证或应用程序关闭)。如果您想要特定于模块,服务或窗口小部件的事件,则应考虑使用服务,指令控制器或第三方库

     
      
  • 直接注入服务和调用方法对于直接通信也很有用
  •   
  • 指令可以通过指令控制器直接相互通信
  •   
     

AngularJS Wiki - Best Practices

另请参阅

答案 1 :(得分:0)

感谢您的积极性和洞察力,我已经通过使用$ scope.on [...]和$ rootscope.broadcast [...]修复了它。 另一方面,“服务方式”也是不错的选择。

今天愉快。