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){ ..... });