2014-11-22 4 views
8

Ich versuche $stateChangeStart mit UI Router in einem Controller zu verwenden. Es sieht so aus, als ob der Callback jedes Mal, wenn er ausgelöst wird, +1 mal mehr als beim letzten Mal auslöst.stateChangeStart triggert mehrmals

$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){ 
    console.log('$stateChangeStart'); 
}); 

Zum Beispiel wird beim ersten Änderungsstart console.log einmal ausgelöst. Zum zweiten Mal console.log wird zweimal gefeuert, etc. usw.

Ich weiß, mit event.preventDefault() wird dieses Verhalten zu stoppen, aber es wird auch alle Verhaltensweisen stoppen und das ist keine realistische Lösung für mich.

ich eine Lösung, obwohl ich wie es vielleicht das Gefühl, ein intelligenter Weg, dies zu handhaben:

var stateChangeStarted = false; 
$rootScope.$on('$stateChangeStart', function(event){ 
    if(!stateChangeStarted) { 
     stateChangeStarted = true; 
     console.log('$stateChangeStart'); 
    } 
}); 

Hat keine Ahnung, jemand, warum dies geschieht und was kann ich sonst noch tun, dies zu verhindern?

Antwort

15

Ihr Controller wird jedes Mal von einem UI-Router instanziiert, wenn Sie den ihm zugeordneten Status eingeben. Daher wird Ihr $rootScope.$on Aufruf ein neues Listener zu dem Ereignis $stateChangeStart jedes Mal hinzufügen, wenn Sie diesen Status eingeben.

Wenn Sie das Ereignis nur einmal pro Controller-Instanz bearbeiten müssen, können Sie die Deregister-Funktion speichern, die $rootScope.$on zurückgibt, und sie innerhalb des Listener-Callbacks ausführen.

+0

Wenn Sie im selben Controller von einer Status-URL zu einer anderen State-URL wechseln, wird diese stateChangeStart nur einmal ausgelöst. – duyn9uyen

4

Löschen Sie die Listener für stateChangeStart am Anfang Ihres Controllers.

$rootScope.$$listeners.$stateChangeStart = []; 
+0

thanks.it funktioniert für mich. – Murali

Verwandte Themen