我的角度应用中有一个隐藏页面,因此只有特殊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;
};
一切都是对的,除了一件事:状态正在改变而不等待请求结果。我想我应该使用解决方案,但我不知道如何正确使用它。
感谢。
答案 0 :(得分:0)
.state('hidden', {
url: '/hidden',
...
resolve: {
data: function(mySvc) {
var id = mySvc.getId();
return mySvc.check(id).then(function(result) {
if (result.error !== 0) {
throw new Error("not allowed");
}
});
}
}
});
定义的data
对象在该隐藏状态下可供您的控制器使用,并且仅在它返回2xx状态代码并且error
属性等于0时才会使用。
如果数据已解析,则会发生状态更改并实例化控制器。如果拒绝,则不会发生这种情况。
作为个人注释,我发现这是一个处理授权的好设备。