AngularJs транслирует повторное исполнение слишком много раз
Внутри одного из моих контроллеров Angular у меня есть это:
// controller A
$rootScope.$on("myEventFire", function(event, reload) {
someAction();
});
В другом контроллере у меня есть следующее:
// controller B
$scope.openList = function(page) {
$rootScope.$broadcast('myEventFire', 1);
}
Теперь это одностраничное приложение. Когда я сначала перейду к контроллеру A и попробую запустить это событие, someAction() будет выполнен один раз. Если я уйду и вернусь обратно к контроллеру А и сделаю то же самое, someAction() будет выполняться дважды. Если я сделаю это снова, это произойдет три раза и так далее.
Что я здесь делаю неправильно?
Ответы
Ответ 1
Можно ли использовать только $scope.$on()
? Каждый раз, когда создается контроллер A, он добавляет новый слушатель в область корня, и это не разрушается при навигации и обратно. Если вы делаете это в локальной области контроллера, слушатель должен быть удален, когда вы перемещаетесь, и ваша область будет уничтожена.
// controller A
$scope.$on("myEventFire", function(event, reload) {
someAction();
});
$broadcast
отправляет событие вниз во все дочерние области, чтобы его можно было найти в локальной области. $emit
работает по-другому, размахивая вверх по направлению к корневому пространству.
Ответ 2
вы также можете удалить его, когда область будет уничтожена, запустив обратный обратный вызов из $rootScope. $on().
т.е.
var destroyFoo;
destroyFoo = $rootScope.$on('foo', function() {});
$scope.$on('$destroy', function() {
destroyFoo(); // remove listener.
});
Ответ 3
если вы не хотите уничтожать,
Я думаю, что мы можем сначала проверить событие слушателя - AngularJS 1.2.15
![Проверить событие прослушивателя - пример]()
Поэтому я думаю, что это должно сработать:
if(!$rootScope.$$listenerCount['myEventFire']){
$rootScope.$on("myEventFire", function(event, reload) {
someAction();
});
}
Ответ 4
В моем случае...
if ($rootScope.$$listenerCount['myEventFire']) {
$rootScope.$$listeners.broadcastShowMessageError = [];
};
$rootScope.$on('myEventFire', function (event, reload) {
someAction();
})
Ответ 5
Если это помогает кому-либо, у меня была аналогичная проблема в директиве. Каждый раз, когда директива открывала количество раз, когда событие было уволено, увеличилось.
Я решил это, используя следующее (это было в моей функции init контроллеров, но я предполагаю, что это могло быть определено в самом контроллере. В моем случае мой контроллер должен был повторно инициализировать при запуске события)
if (!$scope.onMyEvent) $scope.onMyEvent= $scope.$on('myEvent',function(event,data){
.....
});