AngularJs广播重复执行太多次了

在我的一个angular控制员里面,我有这个:

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

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

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

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

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

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

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

你也可以通过从$ rootScope。$ on()运行返回callback来消除范围被破坏的情况。

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

如果你不想破坏,

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

检查监听器事件 - 示例

所以我认为这应该工作:

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

对于我的情况…

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

如果有帮助的话,我在一个指令中有类似的问题。 每次指令打开事件的次数增加。

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

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