2015-05-29 34 views
3

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

我注意到它,当我通过$ rootScope。$调用它从另一个控制器发出时,$ 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 
} 

是否有可能阻止它创建另一个监听器实例,这样,当已经有一个监听器,它不会产生一个新的。

+0

尝试'$范围。$ on'将解决您的问题.. 如果您在控制器本身想,而不是全球.. –

+0

我需要从另一个控制器 – devwannabe

+0

调用它不能摧毁$ rootScope但你可以使用$范围。$ destroy()方法。它将清除所有绑定到$ scope的监听器。 –

回答

7

当控制器的作用域被销毁时,您需要注销事件监听器。

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

所以,你可以将它设置这样的:

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

注:这只会工作,如果控制器的范围实际上是破坏(例如,在从DOM删除或当您导航到一个指令不同的路线)。如果这没有发生,那么你将需要制定一种只注册一次事件监听器的方法。

+1

我意识到这一点,但不会影响正在做$ rootScope的其他控制器。$ emit?它会继续工作吗? – devwannabe

+0

这只是取消注册事件..没有别的。 – sirrocco

+0

它工作! :D谢谢! – devwannabe

相关问题