5

Я использую очень простой перехватчик, чтобы проверить responseRejection for 403 Access Forbidden, чтобы перенаправить пользователей на логин, но он не перенаправляется. Я могу console.log прямо до строки до $ location.path и после нее, и это никогда не происходит. Кто-нибудь еще это случилось? Я немного уставился на это сейчас ... Первоначально я даже не хотел использовать $ location, но я не могу вводить ui.router, не получая циклическую зависимость, и я тоже не могу понять, как чтобы избавиться от такого местоположения, как предполагалось, меня заставляло двигаться, пока я думал об этом.Переадресация AngularJS не происходит в перехватчике

.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

Когда вы делаете '$ location.path' заявление рядом с ним будет работать, потому что изменение пути будет происходить только в следующем цикле переварить. Вероятно, вы не можете прямо вводить '$ state', вместо этого вы можете вводить' $ injector' и получать '$ injector.get ('$ state'). Go (statename)'. Также установка пути местоположения или href и т. Д. Не блокирует активность, то есть он позволит текущему сценарию выполнить полностью, а затем изменить locaiton. – PSL

+0

Спасибо, впрыскивая $ injector works, и я не знал о неблокирующей активности, поэтому еще раз спасибо :) Вы должны отбросить это в ответ ниже, чтобы он стал более заметным, и вы получите больше кредитов. Еще раз спасибо – mtpultz

+0

Рад, что он работает. Конечно, я откажусь от ответа. – PSL

ответ

2

При настройке местоположения окна с помощью location.href он немедленно установить местоположение и остановить выполнение сценариев, но изменение местоположения будет эффективным только тогда, когда текущий путь сценария при выполнении завершается. Вот почему вы видите инструкцию ниже href. Это также не блокирующая активность (в отличие от предупреждения или подсказки). При настройке местоположения с использованием угловой обертки он будет действовать после цикла дайджест. И у вас есть действительная проблема круговой зависимости при инъекции $state в $http перехватчик. Чтобы преодолеть это, вы можете получить экземпляр $state с помощью $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

Я уже слежу, как ваш код, но маршрутизация не работает должным образом. В URL-адресе для успешного маршрута, но просмотр не может отображаться. Можете ли вы просто вести меня. – VjyV