4

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

当我从另一个控制器通过 $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
}

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

4

1 回答 1

9

当您的控制器范围被销毁时,您需要取消注册事件侦听器。

$on函数返回一个注销函数,该函数将在调用该函数时删除侦听器。

所以你可以这样设置:

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

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

于 2015-05-29T05:26:19.273 回答