Rob*_*boy 8 asp.net-web-api angularjs
如果$ http.post返回特定的错误代码,你能告诉我重定向到另一个页面的正确方法吗?
只是为了添加上下文,如果用户未登录或未授权使用API,我想重定向到另一个页面.
function getData(filter) {
var deferred = $q.defer();
var data = JSON.stringify(filter);
$http.post('/myapp/api/getData', data)
.success(function (data, status, headers, config) {
deferred.resolve(data);
})
.error(function (error) {
deferred.reject(error);
});
return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud)
$http.post 具有误导性。到目前为止,最好的答案是@Kliment。拦截器是管理 http 请求之前和之后发生的内容的最佳方式。
但是,如果您的最终目标是阻止访问页面,则至少必须使用路由插件(ngRoute、 ui-router),因为根据 Promise 的想法,http 请求和响应之间总会存在延迟。
根据服务器响应时间,您仍然会看到页面显示大约一秒钟左右。
使用 ui-router,您只需为要保护的每个状态配置解析方法即可。它可能看起来像这样:
.state('protected',
{
url : '/protected_page',
templateUrl : 'secret.html',
resolve: {
loggedin: loggedin
}
})
Run Code Online (Sandbox Code Playgroud)
login指的是您定义的包含 $http.post 调用(或者更好的是服务)的函数
function loggedin($timeout, $q, $location, loginService) {
loginService.then(function(data) {
if(data.status == 401) {
//$timeout(function() { $location.path('/login'); });
return $q.reject();
} else {
return $q.when();
}
});
}
Run Code Online (Sandbox Code Playgroud)
此处此特定服务返回 401 状态,但您可以返回任何内容。
在接受或拒绝之前,状态不会得到解决(并且页面不会显示)。
如果需要,您可以直接从那里重定向,尽管这不是很优雅。ui-router 为您提供了另一种默认重定向的选项:
if (tokenIsValid())
$urlRouterProvider.otherwise("/home");
else
$urlRouterProvider.otherwise("/login");
Run Code Online (Sandbox Code Playgroud)
否则,如果特定请求不存在状态或者解析被拒绝,则告诉 ui-router 转到某些 url。
在另一个主题上,你的http请求写得不好。
.success和.error已被弃用,并且您不需要在本身已经返回承诺的 $http 请求上创建承诺 ( $q )。
上面链接的文档中有一个很好的例子。
归档时间: |
|
查看次数: |
1563 次 |
最近记录: |