6

Pracuję nad pojedynczą aplikacją strony, z kanciastą i mam potrzebę komunikowania się między 2 różnymi dyrektywami, które zasadniczo nie mają relacji rodzic-dziecko.

W dyrektywie A mam 2 miejsca, w których muszę nadawać to samo wydarzenie z różnych funkcji. A w dyrektywie B napisałem $ na słuchacza za to.

Teraz zauważam, że za każdym razem, gdy wywołanie jest wywoływane po raz pierwszy, detektor zostanie wywołany jeden raz. Po kolejnym wywołaniu słuchacz jest wywoływany dwa razy, trzykrotnie itd., Stale się zwiększa.

Funkcja callSecondFunc jest wywoływana, gdy wywołano funkcję callFirstFunc, więc detektor tego również jest wywoływany jako nie. razy słuchacza do emisji w callFirstFunc. Dlaczego więc słuchacz nie jest wywoływany tylko raz, dlaczego wiele razy? Pętla i zwiększanie za każdym razem.

Dyrektywa A:

app.directive("firstDir", function ($rootScope) { 
    return { 
     restrict: 'E', 
     link: function (scope, element, attrs) { 
      // some other code 
      callFirstFunc(); 
      var callFirstFunc = function(){ 
       // some other code 
       $rootScope.$broadcast("someEvent"); 
      } 
      callSecondFunc(); 
      var callSecondFunc = function(){ 
       // some other code 
       $rootScope.$broadcast("someEvent"); 
      } 
     } 
    }; 
}); 

dyrektywa B:

app.directive("secondDir", function ($rootScope) { 
     return { 
      restrict: 'E', 
      link: function (scope, element, attrs) { 
       // some other code 
       scope.$on("someEvent", function(){ 
        detectSTuff(); 
       }) 
       function detectStuff(){ 
        // other code 
       }      
      } 
     }; 
    }); 
+0

Możliwy duplikat [angularjs nadawanych powtarzając wykonanie zbyt wiele razy] (http://stackoverflow.com/questions/19553598/angularjs- broadcast-repeating-execution-too-many-times) – kinkajou

Odpowiedz

1

Chyba zapomniałeś rozpiąć równomierne obsługi.

Można to zrobić jak po -

var someEventHandle = scope.$on("someEvent", function(){ 
 
        detectSTuff(); 
 
       }); 
 
scope.$on('$destroy', someEventHandle);

+4

Rabi - próbowałem, ale wciąż jest tak samo. Jego słuchanie nie raz i ciągle rośnie. – whyAto8