Подтвердить что ты не робот

AngularJs транслирует повторное исполнение слишком много раз

Внутри одного из моих контроллеров Angular у меня есть это:

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

В другом контроллере у меня есть следующее:

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

Теперь это одностраничное приложение. Когда я сначала перейду к контроллеру A и попробую запустить это событие, someAction() будет выполнен один раз. Если я уйду и вернусь обратно к контроллеру А и сделаю то же самое, someAction() будет выполняться дважды. Если я сделаю это снова, это произойдет три раза и так далее. Что я здесь делаю неправильно?

4b9b3361

Ответ 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){
        .....
        });