2014-10-27 29 views
5

Używam bardzo prostego przechwytywacza do sprawdzania odpowiedzi Odrzucenie dla 403 Dostęp Zabronione przekierowywanie użytkowników do logowania, ale nie przekierowuje. Mogę console.log aż do linii przed $ location.path i po nim, i nigdy nie występuje. Czy komukolwiek innemu to się przytrafiło? Wpatrywałam się teraz w to trochę ... Początkowo nawet nie chciałem używać lokalizacji $, ale nie mogę wstrzyknąć pliku ui.router bez uzyskania zależności cyklicznej, co również nie pozwala mi zrozumieć żeby się pozbyć, więc lokalizacja $ miała mnie utrzymać w ruchu, a ja myślałem o tym.Przekierowanie AngularJS nie występuje w przechwytywaczu

.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

Kiedy robisz '$ location.path' zestawieniu obok niej będzie działać, ponieważ nastąpi zmiana ścieżka dopiero w następnym cyklu strawienia. Prawdopodobnie nie możesz bezpośrednio wstrzyknąć '$ state' zamiast tego możesz wstrzyknąć' $ injector' i pobrać '$ injector.get ('$ state'). Go (nazwa_pliku)'. Ustawienie ścieżki lokalizacji lub href itp. Nie blokuje aktywności, co oznacza, że ​​pozwala na wykonanie bieżącego skryptu, a następnie zmianę lokalizacji. – PSL

+0

Dzięki, wstrzyknięcie $ injector działa, a ja nie wiedziałem o nieblokującej aktywności, więc dziękuję jeszcze raz. Powinieneś to zamieścić w odpowiedzi poniżej, aby była bardziej widoczna, a otrzymasz więcej punktów. Jeszcze raz dziękuję – mtpultz

+0

Cieszę się, że działa. Oczywiście, odrzucę odpowiedź. – PSL

Odpowiedz

2

Podczas ustawiania położenia okna za pomocą location.href to nie od razu ustawić lokalizację i zatrzymać wykonywanie skryptów, ale zmiana lokalizacji będzie skuteczna tylko wtedy, gdy obecna ścieżka skryptu w trakcie realizacji jest zakończona. Dlatego widzisz, że poniżej jest wykonywane zdanie href. Nie jest to również działanie blokujące (w przeciwieństwie do alertu lub polecenia). Podczas ustawiania położenia za pomocą owijarki kątowej, zostanie ona zastosowana po cyklu trawienia. I masz ważny problem zależności cyklicznej podczas wstrzykiwania $state w przechwytywaczu . Aby przezwyciężyć, że można uzyskać wystąpienie $state za pomocą $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

Podążam już za tym samym, co kod, ale routing nie działa poprawnie. W adresie URL do udanej trasy, ale widok nie może wyświetlać. Czy możesz mnie po prostu prowadzić? – VjyV