2013-10-21 13 views
5

mia fabbrica si presenta come:

'use strict'; 

angular.module('myApp') 
    .factory('httpInterceptor',['$q','$location', '$rootScope', function($q, $location, $rootScope){ 
    return { 
     response: function(response) { 

     if(response.success === false) { 
console.log("Redirecting"); 
      $location.path('/login'); 
      return $q.reject(response); 
     } 

     return response || $q.when(response); 
     } 
    } 
}]); 

Sputa il registro, ma non cambia il percorso. Cosa posso fare per farlo accadere?

+0

Domanda correlata: http://stackoverflow.com/questions/25579938/location-path-not-working-from-http-interceptor/ – Sirozha

risposta

10

Il documentation for $location dice:

Nota che i setter non si aggiornano immediatamente window.location. Al contrario, il servizio $ location è a conoscenza del ciclo di vita dello scope e raggruppa più mutazioni di $ location in un "commit" all'oggetto window.location durante la fase $ digest dell'ambito.

Quindi, se il rifiuto della promessa ha effetto su $location, allora non si può vedere il cambiamento previsto.

Per forzare una modifica al di fuori del ciclo di vita angolare, è possibile impostare hash utilizzando window.location e quindi forzare un ricaricamento della pagina. Ciò, naturalmente, interromperà l'esecuzione di qualsiasi codice che segue e cancellerà la sessione, ma potrebbe essere quello che vuoi se l'utente non ha effettuato il login.

+0

Ho trovato molto frustrante non riuscire a ottenere varie soluzioni angolari al funzionamento di reindirizzamento e dovendo ricorrere a window.location per il mio reindirizzamento. – JnJnBoo

0

Prova

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

invece di

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

Ci sono alcuni casi in cui $ location non reindirizzerà se è ciclo di applicazione angolare esterno. Prova a inserire la posizione $ all'interno di $ apply.

$rootScope.$apply(function(){$location.path('/somelocatin'); }); 
+1

stai barando Angular? – Reyraa

+0

esiste un rischio con questo metodo? L'ho usato - e ha funzionato. questo può influenzare lo stato dell'applicazione? – orberkov

3

Questo ha funzionato per me su Angular 1.3.14

myServices.factory('Factory', ['$rootScope', '$location', function ($rootScope, $location) { 
    // do something and redirect 
    $location.path('path') 
    $rootScope.$apply() 
}]) 

Si noti che il $rootScope.$apply() è dopo la chiamata $location.path('path'), per qualche ragione, avvolgendolo all'interno del $ applicare richiamata come suggerito sopra wasn' t lavorando.

Problemi correlati