Javascript 从同一指令多次激发事件侦听器

Javascript 从同一指令多次激发事件侦听器,javascript,angularjs,angularjs-directive,ngroute,ng-view,Javascript,Angularjs,Angularjs Directive,Ngroute,Ng View,在我的应用程序中,我使用了一个自定义指令和一个窗口调整事件侦听器: link: function(scope, elem, attrs) { angular.element($window).bind('resize', function() { // viewId is a unique reference to the view in which the directive lives console.log(scope.viewId); })

在我的应用程序中,我使用了一个自定义指令和一个窗口调整事件侦听器:

link: function(scope, elem, attrs) {
    angular.element($window).bind('resize', function() {
        // viewId is a unique reference to the view in which the directive lives
        console.log(scope.viewId);
    });
}
此指令在我的每个视图中插入1次或多次

让我困惑的是,为什么不仅要为活动视图执行函数,还要为非活动视图执行函数。一旦我访问了多个视图,就会发生这种情况

更让我困惑的是,为什么在我多次访问同一视图之后,从同一视图多次调用该函数

在我看来,旧的指令作用域并没有被销毁,而是保持了活动状态,并在旧指令作用域的基础上创建了一个新的作用域

我能做些什么来防止这种行为


下面是基于Renan Lopes Ferreira提供的答案的工作解决方案的代码片段(我使用LoDash u.debounce来防止函数被频繁调用):


当指令被破坏时,您需要删除侦听器。比如:

angular.element($window).on('resize', resize);

scope.$on('$destroy', function () {
  angular.element($window).off('resize', resize);
});

function resize(){
    ...
}

对于找到的具有相同名称的每个指令,将调用一次In指令链接函数

因此,如果视图中有两次指令,它将执行两次链接函数

如果您只想运行一次函数,只需在“compile”函数中完成您的工作


查看本教程,他很棒:

感谢您的有用输入。在我的用例中,可以为视图中的每个指令多次调用函数,我只是不希望为已销毁的指令调用它们。
angular.element($window).on('resize', resize);

scope.$on('$destroy', function () {
  angular.element($window).off('resize', resize);
});

function resize(){
    ...
}