AngularJs广播重复执行次数太多次

mis*_*eka 51 angularjs angularjs-scope

在我的一个Angular控制器中,我有这个:

// controller A
$rootScope.$on("myEventFire", function(event, reload) {
    someAction();
});
Run Code Online (Sandbox Code Playgroud)

在另一个控制器中我有这个:

// controller B
$scope.openList = function(page) {
    $rootScope.$broadcast('myEventFire', 1);
}
Run Code Online (Sandbox Code Playgroud)

现在,这是一个单页应用程序.当我最初转到控制器A并尝试触发此事件时,someAction()将被执行一次.如果我离开并再次回到控制器A并做同样的事情,someAction()会被执行两次.如果我再做一次,它会发生三次,依此类推.我在这做错了什么?

Jas*_*aat 95

你能尝试一下$scope.$on()吗?每次创建控制器A时,它都会在根作用域上添加一个新的侦听器,并且在您离开和返回时不会被销毁.如果在控制器的本地范围内执行此操作,则当您离开并且范围被破坏时,应该删除侦听器.

// controller A
$scope.$on("myEventFire", function(event, reload) {
    someAction();
});
Run Code Online (Sandbox Code Playgroud)

$broadcast将事件向下发送到所有子范围,以便在本地范围内获取它. $emit另一种方式是向根范围冒泡.

  • 生活中有很多事情我很感激......这个答案就是其中之一. (11认同)
  • 哇.哇哇.谢谢你的精彩回答.在过去的45分钟里,我的头撞在砖墙上,试图理解为什么我的$ rootScope.$ on ...方法被调用的次数超过它应该的次数.谢谢. (2认同)

jaf*_*af0 26

你也可以在销毁范围时通过运行$ rootScope.$ on()的返回回调来删除它.

var destroyFoo;

destroyFoo = $rootScope.$on('foo', function() {});

$scope.$on('$destroy', function() {
  destroyFoo(); // remove listener.
});       
Run Code Online (Sandbox Code Playgroud)


van*_*102 8

如果你不想破坏,

我想我们可以先检查一下监听器事件 - AngularJS 1.2.15

检查侦听器事件 - 示例

所以我认为这应该有效:

if(!$rootScope.$$listenerCount['myEventFire']){
    $rootScope.$on("myEventFire", function(event, reload) {
        someAction();
    });
}
Run Code Online (Sandbox Code Playgroud)