AngularJs diffuse trop souvent l’exécution répétée

Dans l’un de mes contrôleurs angulars, j’ai ceci:

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

Dans un autre contrôleur, j’ai ceci:

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

Maintenant, ceci est une application à une seule page. Lorsque je vais au contrôleur A initialement et que j’essaie de déclencher cet événement, someAction () va être exécuté une fois. Si je me déplace et reviens au contrôleur A pour faire la même chose, someAction () est exécuté deux fois. Si je recommence, cela se produit trois fois et ainsi de suite. Que fais-je mal ici?

Pouvez-vous essayer d’utiliser $scope.$on() ? Chaque fois que le contrôleur A est créé, il ajoute un nouvel écouteur dans la scope racine , et cela ne se détruit pas lorsque vous naviguez loin. Si vous le faites sur la scope locale du contrôleur, l’auditeur doit être supprimé lorsque vous quittez et que votre scope est détruite.

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

$broadcast envoie l’événement vers le bas à toutes les scopes enfants afin qu’il soit pris en compte dans votre scope locale. $emit fonctionne dans l’autre sens en se dirigeant vers la scope racine.

vous pouvez également le supprimer lorsque la scope est détruite, en exécutant le rappel à partir de $ rootScope. $ on ().

C’est à dire

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

si vous ne voulez pas détruire,

Je pense que nous pouvons vérifier l’événement de l’auditeur en premier – AngularJS 1.2.15

Vérifier l'événement de l'auditeur - exemple

Donc, je pense que cela devrait fonctionner:

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

Si cela aide quelqu’un, j’ai eu un problème similaire dans une directive. À chaque fois, la directive ouvrait le nombre de fois où l’événement était déclenché.

Je l’ai résolu en utilisant ce qui suit (c’était dans la fonction d’initialisation de mon contrôleur mais je suppose qu’il aurait pu être défini dans le contrôleur lui-même. Dans mon cas, mon contrôleur devait se réinitialiser au déclenchement de l’événement)

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

Pour mon cas …

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