2014-10-27 10 views
5

Utilizzo un intercettore molto semplice per controllare responseRejection per 403 Access Forbidden per reindirizzare gli utenti all'accesso, ma non reindirizza. Posso console.log fino alla riga prima di $ location.path e dopo di esso, e non si verifica mai. Qualcun altro ha avuto questo successo? Sono stato a guardare questo per un po 'ora ... Originariamente non volevo nemmeno usare $ location, ma non posso iniettare ui.router senza ottenere una dipendenza circolare, che non riesco a capire come per liberarmi di così $ posizione avrebbe dovuto farmi muovere, mentre ci pensavo.Reindirizzamento AngularJS in interceptor

.factory('AuthInterceptor', ['$q', '$location', 
    function($q, $location) { 

    var service = { 
     responseError: function(responseRejection) { 

      // Authorization issue, access forbidden 
      if(responseRejection.status === 403) { 

       // TODO: show a login dialog, and/or redirect to login 
       console.log("Response rejected. Redirecting to login..."); 

       $location.path('/login'); 
       $location.replace(); 

       console.log("Not so much with the redirecting... I'm still here"); 
      } 

      // Propagate error to any chained promise handlers 
      return $q.reject(responseRejection); 
     } 
    } 

    return service; 
}]) 
+2

Quando si esegue '$ location.path' l'istruzione successiva ad esso verrà eseguito perché si verificherà il cambiamento percorso solo nel successivo ciclo di digerire. Probabilmente non si può iniettare direttamente '$ stato', invece si può iniettare' $ injector' e ottenere '$ injector.get ('$ stato'). Go (statename)'. Anche l'impostazione del percorso di localizzazione o href ecc non sta bloccando l'attività, il che significa che lascerà eseguire lo script corrente completamente e quindi cambierà il luogo. – PSL

+0

Grazie, l'iniezione di $ injector funziona, e non sapevo nulla dell'attività di blocco, quindi grazie ancora :) Dovresti inserire questa risposta in una risposta in basso in modo che sia più visibile e ottieni più credito. Grazie ancora – mtpultz

+0

Felice che funzioni. Certo, lascerò cadere una risposta. – PSL

risposta

2

Quando si imposta la posizione finestra utilizzando location.href lo fa impostare la posizione immediatamente e fermare l'esecuzione di script, ma il cambiamento posizione sarà efficace solo quando il percorso script corrente in corso di esecuzione è stata completata. Questo è il motivo per cui vedi la dichiarazione qui sotto che href viene eseguito. Non è un'attività di blocco (diversamente da avviso o prompt). Quando si imposta la posizione utilizzando l'involucro angolare, avrà effetto dopo il ciclo di digestione. E hai un problema valido di dipendenza circolare durante l'iniezione di $state nell'intercettore $http. Per superare che si può ottenere l'istanza di $state utilizzando $injector.

.factory('AuthInterceptor', ['$q', '$injector', 
    function($q, $injector) { 

    var $state; 

    var service = { 
     responseError: function(responseRejection) { 

      // Authorization issue, access forbidden 
      if(responseRejection.status === 403) { 

       // TODO: show a login dialog, and/or redirect to login 
       console.log("Response rejected. Redirecting to login..."); 

       _setState('login'); 

       console.log("Not so much with the redirecting... I'm still here"); 
      } 

      // Propagate error to any chained promise handlers 
      return $q.reject(responseRejection); 
     } 
    } 
    function _setState(stateName){ 
     if(!$state) { 
      $injector.get('$state'); //Or just get $state from $injector always it is anyways the dependency container and service are singletons 
     } 
     $state.go(stateName); 
    } 
    return service; 
}]); 
+0

Ho già seguito lo stesso come il tuo codice ma il routing non funziona correttamente. In url nella rotta corretta ma la vista non può essere visualizzata. Puoi solo guidarmi. – VjyV

Problemi correlati