【发布时间】:2015-01-18 20:12:52
【问题描述】:
我的 Angular 应用程序中有一个隐藏页面,因此只有特殊 id 用户才能访问它。为了实现它,当状态更改为隐藏状态时,我向服务器发送 HTTP get 请求(因为只有服务器知道该特殊 ID)。
如果服务器以错误消息响应我,那么我会阻止状态更改过程,否则用户会转到该特殊页面。
这是我正在使用的代码:
angular
.run(["$rootScope", "$location", "$state", "mySvc", function ($rootScope, $location, $state, mySvc) {
var id = mySvc.getId();
$rootScope.$on( '$stateChangeStart', function(event, toState , toParams, fromState, fromParams) {
if(toState.name === "specialstate") {
mySvc.check(id)
.then(function(result) {
if(result.error !== 0) {
event.preventDefault();
}
}, function(error) {
event.preventDefault();
});
}
});
}]);
服务功能:
function check(id) {
var deferred = $q.defer();
$http({
url: "/api/url",
method: "GET",
headers: {'Content-Type': 'application/json'}
}).
then(function (result) {
console.log(result);
if(result.data.error === 0) {
deferred.resolve(result.data);
}
else {
deferred.reject(result.data);
}
}, function (error) {
deferred.reject(error);
});
return deferred.promise;
};
一切都是正确的,除了一件事:状态正在改变而不等待请求结果。我觉得应该用resolve,但是不知道怎么正确使用。
谢谢。
【问题讨论】:
-
您的承诺将在
$stateChangeStart事件处理程序完成执行后很久才解决。到那时,再拨打event.preventDefault()就太迟了,而且不会有任何效果。我认为您需要重新考虑您的方法,因为这种方法行不通。