6

Ich arbeite an einer einzigen Seite App, mit eckigen und ich habe eine Notwendigkeit, zwischen zwei verschiedenen Direktiven, die im Grunde keine Eltern Kind Beziehung haben.

In Richtlinie A habe ich 2 Stellen, an denen ich dasselbe Ereignis von verschiedenen Funktionen aus senden muss. Und in Richtlinie B, haben Sie einen $ auf Listener dafür geschrieben.

Nun, ich beobachte, dass die wann immer callFirstFunc & seine Sendung zum ersten Mal aufgerufen wird, wird der Listener einmal aufgerufen werden. Beim nachfolgenden Aufruf wird der Listener zweimal, dreimal usw. aufgerufen und nimmt weiter zu.

Die callSecondFunc wird aufgerufen, wenn die callFirstFunc ausgeführt wurde, daher wird der Listener für diese auch als viele Nein bezeichnet. von Zeiten der Hörer für die Übertragung in CallFirstFunc. Also, warum wird der Hörer nicht nur einmal gerufen, warum mehrmals? Es wird jedes Mal wiederholt und erhöht.

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

Richtlinie 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

Mögliche Duplikat [AngularJS Ausführung zu oft ausgestrahlt Wiederholung] (http://stackoverflow.com/questions/19553598/angularjs- Broadcast-Repeating-Execution-zu-viele-mal) – kinkajou

Antwort

1

Ich denke, Sie auch Handler unbind vergessen.

Sie können es wie folgt -

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

+4

Rabi - Ich habe es versucht, aber es ist immer noch dasselbe. Es hört mehr als einmal zu und nimmt weiter zu. – whyAto8