在使用AngularJS的工厂中,$ location.path不会更改

Sha*_*oon 5 angularjs angularjs-routing angularjs-factory

我的工厂看起来像:

'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);
      }
    }
}]);
Run Code Online (Sandbox Code Playgroud)

它吐出日志,但不会改变路径.我该怎么做才能实现这一目标?

mus*_*_ut 10

$ location文档说:

请注意,setter不会立即更新window.location.相反,$ location服务知道范围生命周期,并在范围$ digest阶段将多个$ location突变合并到window.location对象的"commit"中.

因此,如果拒绝承诺会产生影响$location,那么您可能看不到预期的变化.

要强制在角度生命周期之外进行更改,可以设置hash使用window.location,然后强制重新加载页面.当然,这将停止执行后面的任何代码并擦除会话,但如果用户未登录,则可能是您想要的.


upt*_*nhr 6

在某些情况下,如果位置超出角度的应用周期,$ location将不会重定向.尝试在$ apply中包装$ location.

$rootScope.$apply( function(){$location.path('/somelocatin'); } );
Run Code Online (Sandbox Code Playgroud)