在我的一个Angular控制器中,我有这个:
// controller A
$rootScope.$on("myEventFire", function(event, reload) {
someAction();
});
在另一个控制器中,我有这个:
// controller B
$scope.openList = function(page) {
$rootScope.$broadcast('myEventFire', 1);
}
现在,这是一个单页应用。当我最初去控制器A并尝试触发此事件时, someAction()将被执行一次。如果我离开并再次回到控制器A并执行相同的操作, someAction()将被执行两次。如果我再做一次,它会发生三次,依此类推。 我在这里做错了什么?
答案 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
所以我认为这应该有效:
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();
})