2013-10-21 63 views
5

我厂的样子改变:

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

它吐出来的日志,但不改变路径。我能做些什么来做到这一点?

+0

相关问题:http://stackoverflow.com/questions/25579938/location-path-not-working-from-http-interceptor/ – Sirozha

回答

10

documentation for $location说:

注意的制定者不会立即更新window.location的。相反,$ location服务意识到范围生命周期,并在范围$摘要阶段将多个$ location突变合并为一个“提交”到window.location对象。

因此,如果承诺的拒绝对$location有影响,那么您可能看不到预期的更改。

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

+0

我发现它非常令人沮丧,无法获得各种角度解决方案重定向工作,并不得不求助于window.location进行重定向。 – JnJnBoo

0

尝试

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

,而不是

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

有些情况下$ location不会重定向,如果它是外角应用周期。尝试在$ apply内包装$ location。

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

你在欺骗Angular吗? – Reyraa

+0

使用此方法有风险吗?我用它 - 它工作。这会影响应用程序状态吗? – orberkov

3

这一个为我工作的角度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')调用后,由于某种原因,它包裹在里面$应用调用回调以上WASN的建议”不工作。