$location.path не меняется на фабрике с AngularJS

Моя фабрика выглядит так:

'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);
      }
    }
}]);

Он выплевывает журнал, но не меняет путь. Что я могу сделать, чтобы это произошло?


person Shamoon    schedule 21.10.2013    source источник
comment
Связанный вопрос: stackoverflow.com /вопросы/25579938/   -  person Sirozha    schedule 09.12.2014


Ответы (4)


В документации для $location говорится:

Обратите внимание, что сеттеры не обновляют window.location сразу. Вместо этого служба $location знает о жизненном цикле области видимости и объединяет несколько мутаций $location в одну «фиксацию» объекта window.location во время фазы дайджеста области видимости.

Следовательно, если отклонение обещания повлияет на $location, вы можете не увидеть предполагаемого изменения.

Чтобы принудительно внести изменения вне жизненного цикла angular, вы можете установить hash с помощью window.location, а затем принудительно перезагрузить страницу. Это, конечно, остановит выполнение любого последующего кода и удалит сеанс, но это может быть то, что вам нужно, если пользователь не вошел в систему.

person musically_ut    schedule 02.11.2013
comment
Меня очень разочаровывало то, что я не мог получить различные угловые решения для работы перенаправления, и мне приходилось прибегать к window.location для моего перенаправления. - person Jenn; 14.01.2014

В некоторых случаях $location не будет перенаправляться, если он находится вне цикла применения angular. Попробуйте обернуть $location внутри $apply.

$rootScope.$apply( function(){$location.path('/somelocatin'); } );
person uptownhr    schedule 02.11.2013
comment
ты обманываешь Angular? - person Reyraa; 24.11.2014
comment
есть ли риск при использовании этого метода? Я использовал его - и это сработало. может ли это повлиять на состояние приложения? - person orberkov; 13.09.2015

Этот работал у меня на Angular 1.3.14.

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

Обратите внимание, что $rootScope.$apply() находится после вызова $location.path('path'), по какой-то причине обертывание его внутри обратного вызова вызова $apply, как было предложено выше, не сработало.

person simo    schedule 11.03.2015

Пытаться

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

вместо

$location.path('/login');
person Conqueror    schedule 01.11.2013