6

Sto lavorando su un'applicazione a singola pagina, con angolare e ho bisogno di comunicare tra 2 direttive diverse che fondamentalmente non hanno una relazione genitore figlio.

Nella direttiva A, ho 2 posizioni in cui è necessario trasmettere lo stesso evento da diverse funzioni. E nella Direttiva B, ho scritto un ascoltatore su $ per questo.

Ora, osservo che ogni volta che si chiamaFirstFunc & la sua trasmissione viene chiamata per la prima volta, il listener verrà chiamato una volta. Alla successiva chiamata, l'ascoltatore viene chiamato due volte, tre volte e così via, continua ad aumentare.

CallSecondFunc viene chiamato quando è stato eseguito callFirstFunc, quindi l'ascoltatore per questo viene chiamato anche numero n. di volte l'ascoltatore per la trasmissione in callFirstFunc. Quindi, perché il listener non viene chiamato solo una volta, perché più volte? È in loop e aumenta ogni volta.

direttiva R:

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"); 
      } 
     } 
    }; 
}); 

direttiva 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

Eventuali duplicati di [AngularJs trasmessi a ripetere l'esecuzione troppe volte] (http://stackoverflow.com/questions/19553598/angularjs- broadcast-repeat-execution-too-many-times) – kinkajou

risposta

1

penso che ti sei dimenticato di separare l'ancor gestore.

Si può fare come segue -

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

+4

Rabi - Ci ho provato, ma è sempre lo stesso. Il suo ascolto più di una volta e continua ad aumentare. – whyAto8

Problemi correlati