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

时间:2013-10-23 22:36:33

标签: angularjs angularjs-scope

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

// controller A
$rootScope.$on("myEventFire", function(event, reload) {
    someAction();
});

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

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

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

5 个答案:

答案 0 :(得分:93)

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

// controller A
$scope.$on("myEventFire", function(event, reload) {
    someAction();
});

$broadcast将事件向下发送到所有子范围,因此应该在本地范围内选择它。 $emit以另一种方式向根范围内冒泡。

答案 1 :(得分:25)

你也可以在销毁范围时删除它,方法是运行$ rootScope的返回回调。$ on()。

var destroyFoo;

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

$scope.$on('$destroy', function() {
  destroyFoo(); // remove listener.
});       

答案 2 :(得分:8)

如果你不想破坏,

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

Check listener event - example

所以我认为这应该有效:

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

答案 3 :(得分:2)

如果它可以帮助我在指令中遇到类似问题的任何人。每次指令打开事件被触发的次数增加。

我通过使用以下方法解决了这个问题(这是在我的控制器初始化函数中,但我想它可能已在控制器本身中定义。在我的情况下,我的控制器需要在事件触发时重新初始化)

 if (!$scope.onMyEvent) $scope.onMyEvent= $scope.$on('myEvent',function(event,data){
        .....
        });

答案 4 :(得分:1)

对于我的情况......

if ($rootScope.$$listenerCount['myEventFire']) {
    $rootScope.$$listeners.broadcastShowMessageError = [];
};

$rootScope.$on('myEventFire', function (event, reload) {
    someAction();
})