angularjs - 防止 $rootScope.$on 多次调用函数

标签 angularjs rootscope

我在 Controller 顶部有一个 $rootScope.$on 代码。我注意到每次我加载/调用这个 Controller 时, $rootScope.$on 监听器都会增加,这意味着它会在你访问 Controller 时无限期地添加、添加和添加一个监听器。

当我从另一个 Controller 通过 $rootScope.$emit 调用它时,我注意到它, $rootScope.$on 中的函数被执行了多次,即使它只是一个发射/广播。

$rootScope.$on('listen', function() {
    $scope.displayString();
});

$scope.displayString = function() {
    console.log('test'); // This display 7 times because I visit the controller 7 times
}

是否有可能阻止它创建另一个监听器实例,以便当已经有一个监听器时,它不会创建一个新的监听器。

最佳答案

当您的 Controller 的作用域被销毁时,您需要取消注册事件监听器。
$on函数返回一个注销函数,该函数将在调用该函数时删除监听器。

所以你可以这样设置:

var deregister = $rootScope.$on('listen', function() {
    $scope.displayString();
});
$scope.$on('$destroy', deregister);

注意:这仅在 Controller 的范围被实际销毁时才有效(例如,在从 DOM 中删除的指令中或导航到不同的路由时)。如果这没有发生,那么您将需要找出一种方法,只注册一次事件监听器。

关于angularjs - 防止 $rootScope.$on 多次调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30521559/

相关文章:

javascript - 用于发送 Twilio SMS 消息的 AngularJS 服务

javascript - Angular 路线不会重定向

javascript - 从 $rootScope 中的指令调用函数 - AngularJS

javascript - 为什么不建议将 $rootScope 与函数一起使用?

javascript - AngularJS $rootScope 变量存在,但无法访问

angularjs - 广播根范围变化

javascript - 通过更改 css top 在 div 动画中垂直滚动

javascript - 表中自定义 html 标签的 Angular 指令

javascript - ag-grid + templateUrl 在 IE9 中崩溃

javascript - Angularjs 指令中 $eval 执行函数的替代方案