2014-04-10 8 views
5

Ramping up auf Winkel und ui-Router

und kämpft mit in einem anderen Zustand umgeleitet, wenn eine Voraussetzung nicht erfüllt ist:

ich versuchte, mit ein Abfangjäger: (How do I preform a redirect in an angular interceptor).

Aber jemand erwähnte, dass die Handhabung von $ stateChangeState angemessener wäre. Aber ich bin noch läuft in einer Endlosschleife:

/** 
    * Check here for preconditions of state transitions 
    */ 
    $rootScope.$on('$stateChangeStart', function(event, toState) { 

     // which states in accounts to be selected 
     var accountRequiredStates = ['user.list', 'user.new']; 
     if(_.contains(accountRequiredStates, toState.name)){ 
      event.preventDefault(); 
      ApiAccount.customGET('get_current').then(function(resp){ 
       // if I have a selected account, go about your business 
       if(resp.hasOwnProperty('id')){ 
        $state.go(toState.name); 
       } else { // prompt user to select account 
        $state.go('user.select_account'); 
       } 
      }) 
     } 
    }); 

Kann jemand empfehlen, ein besseres Muster (eine, die funktioniert)

Dank!


Hinweis: Ein ähnliches Problem hier anderen Ansatz: How do I preform a redirect in an angular interceptor

+0

Sie sollten das Ereignis nur verhindern, wenn Sie umleiten möchten. Ich denke, '$ state.go' muss in eine '$ timeout'-Funktion eingebunden werden. – zeroflagL

+0

danke - könnten Sie einen Code-Snipit teilen? – Jonathan

+0

Ich denke, Ihre Frage ist mit http://stackoverflow.com/questions/21631896/why-does-thisangular-ui-router-code-cure-an-infinite-loop-in-digest – linkary

Antwort

1

Ich glaube nicht, dass es etwas falsch mit dem allgemeinen Weg, Sie versuchen, dies zu tun, obwohl ich kein Experte bin. Ich sehe einen Fehler in der Implementierung, der aussieht, als könnte er eine Endlosschleife verursachen. Angenommen, der Benutzer versucht, in den Status 'user.new' zu wechseln. Ihr $ stateChangeStart-Listener fängt das ab, bricht es ab, tut Ihr customGET; Wenn die innere if-Bedingung wahr ist (resp.hasOwnProperty('id')), versuchen Sie, den Benutzer in denselben 'user.new'-Zustand zu schicken. An diesem Punkt unterbricht Ihr $ stateChangeStart-Listener es, bricht es usw. ab und wieder ab.

So wie ich dieses Problem in meinem Code vermeiden, ist eine Variable zu haben (in den Dienst, wo ich den Hörer erklären) mir Bypass zu helfen, die überprüfen: var middleOfRedirecting = false; In Ihrem inneren wenn Block innerhalb des resp.hasOwnProperty('id') zu überprüfen, setzen middleOfRedirecting zu wahr; Fügen Sie eine Bedingung am Anfang Ihres $ stateChangeStart-Listeners hinzu, um nur event.preventDefault() aufzurufen und umzuleiten, wenn middleOfRedirecting false ist. Sie benötigen außerdem einen $ stateChangeSuccess-Listener, um middleOfRedirecting auf false zurückzusetzen und ihn für die nächste Statusänderung zurückzusetzen. (Ich habe das Gefühl, dass es einen besseren Weg geben sollte als das, aber es funktioniert zumindest.)