这是你相当直接的设置,我有一个http拦截器正在寻找401s,如果发现用户被重定向到登录页面:
function($location, $q)
{
return {
request: function (config) {
return config || $q.when(config);
},
requestError: function(request){
return $q.reject(request);
},
response: function (response) {
return response || $q.when(response);
},
responseError: function (response)
{
if (response && response.status === 401)
{
$location.path('/login');
}
return $q.reject(response);
}
};
}
Run Code Online (Sandbox Code Playgroud)
问题是$location.path('/login')呼叫似乎不起作用,路径完全被忽略,我仍然在我的会话到期时我在路上(尽管是空白页).一种可能的解决方法是使用传统方法,window.location = '/#!/login';但我发现这不太理想.我还发现,如果我删除该return $q.reject(response);行,我得到它的工作,但这引入了另一个错误,其中无法找到响应的数据属性(此处讨论的解决方案:Angular.js $ http.post TypeError:无法读取未定义的属性'data') .
我正在跑角1.2.21.
关于可能会发生什么的任何想法?回到window.location不是世界的尽头,但我喜欢这个神秘的一个很好的整洁解决方案:).
提前致谢.
我的parse / AngularJS应用程序正在使用Promises。在登录功能是假设重定向与用户$ location.path,但我不得不调整它,使其根据该岗位工作:
在AngularJS中$ location.path不会在工厂中更改
根据这一SO用户,你需要将调用替换到$ location.path与
$rootScope.$apply( function(){$location.path('/somelocatin'); } );
Run Code Online (Sandbox Code Playgroud)
在这里查看答案:https : //stackoverflow.com/a/19738154/1743693
这解决了问题,但我必须了解:为什么本地电话不起作用?调整如何解决该问题?我怎么知道我没有搞乱AngularJS周期?还是与Promise模式的Parse实现更相关?
这是登录代码:
function login() {
vm.dataLoading = true;
var response = AuthenticationService.Login(vm.email, vm.password).then(
function (user) {
vm.dataLoading = false;
//$location.path('/'); -- <-- **doesn't work**
vm.user = Parse.User.current().getEmail();
$rootScope.$apply(function () { $location.path('/'); });
},
function () {
$rootScope.$apply(function () { $location.path('/login'); });
FlashService.Error(response.message);
vm.dataLoading = false;
});
};
Run Code Online (Sandbox Code Playgroud)
和身份验证服务的实现:
function Login(username, password, success, error) {
return Parse.User.logIn(username, …Run Code Online (Sandbox Code Playgroud)