javascript - 事件监听器从同一指令多次触发

标签 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);
    });
}

该指令在我的每个 View 中插入 1 次或多次。

令我困惑的是为什么该函数不仅针对事件 View 执行,而且还针对非事件 View 执行。一旦我访问了多个 View ,就会发生这种情况。

更让我困惑的是,为什么在我多次访问同一个 View 后,该函数会从同一个 View 多次调用。

在我看来,旧的指令作用域没有被破坏,而是保持事件状态,并且在旧的作用域之上创建了一个新的作用域。

我可以采取什么措施来防止这种行为?

<小时/>

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

windowResize = _.debounce(function () {
    // My logic
    $scope.$apply();
}, 150);

// Attach debounced function to the window.resize event listener
angular.element($window).on('resize', windowResize);

// Remove the function when the directive is destroyed
$scope.$on('$destroy', function () {
    angular.element($window).off('resize', windowResize);
});

最佳答案

当您的指令被销毁时,您需要删除监听器。像这样的东西:

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

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

function resize(){
    ...
}

关于javascript - 事件监听器从同一指令多次触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34288157/

相关文章:

javascript - 同位素物体列表,物体 splinter

javascript - 将范围变量从指令传递到其 Controller

javascript - 将 JSON 从 PHP Controller 传递到 AngularJS Controller 的最佳方法?

javascript - 检测指令是否从 DOM 中移除

javascript - 使用 array.prototype.foreach 的 $scope 变量 'undefined'

javascript - JavaScript 递归问题

JavaScript – 计算器上的重置按钮问题

javascript - jQuery 中的 AJAX 调用,什么定义了 "json"作为参数?

javascript - Angular 绝对路线和路线/stateProvider

angularjs - 在 Angularjs 指令隔离范围内定义函数