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

时间:2013-10-21 15:59:23

标签: 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);
      }
    }
}]);

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

4 个答案:

答案 0 :(得分:10)

documentation for $location说:

  

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

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:3)

这个在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调用回调中,如上所述,这不起作用。

答案 3 :(得分:0)

尝试

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

而不是

$location.path('/login');