我正在创建一个resolve函数,它验证后端的令牌并返回成功true或成功false。如果为false,则重定向到错误页面,如果经过验证,则会加载页面。
.when('/resetPassword/:id/:token', {
templateUrl: 'site/resetPassword/resetPassword.html',
controller: 'resetPasswordCtrl',
entitled: 'reset',
authenticate: true,
resolve: {
isValid: ['resetTokenService','$route' , function(resetTokenService, $route) {
return resetTokenService.validate($route.current.params.id, $route.current.params.token);
}]
}
})
这是服务:
app.service('resetTokenService', function (userResourceResourceFactory, $rootScope, $location, CONFIG, $http) {
var self = this;
var errorMsg;
$rootScope.errorObject = {errorMessage: null, errorCode: null,errorTime :null,errorStackTrace: null,url:window.location.href,partnerCode:null};
this.validate = function(id, token) {
$http({
method: 'POST',
url: CONFIG.MSA_URL + '/validate/' + id +'/' + token,
}).success(function (data) {
if (data.success) {
return true;
} else if (!data.success){
switch (data.error) {
case 'expired':
errorMsg = 'This link has expired. Please request a new one.';
break;
default : errorMsg = 'This link is invalid.';
}
$rootScope.errorObject.errorMessage=errorMsg;
$location.path('ErrorPage');
return false;
}
}).error(function () {
$rootScope.errorObject.errorMessage=errorMsg;
$location.path('ErrorPage');
return false;
});
};
});
效果很好;但是,如果无效,密码页会在通过if和case语句时暂时闪烁。因此它已被解决了#34;当后端调用返回时,而不是当它返回true或false时。
我想知道如何使页面不闪存并让resolve {}函数在它返回true或false /重定向之前不做任何事情
答案 0 :(得分:0)
validate
函数应该返回一个promise。目前,我相信您的路线实际上正在立即解决(而不是在后端呼叫回来时),因为您的validate
功能不会返回任何内容。这意味着,现在,它可能总是将undefined
返回给您的控制器。
您可以首先返回来自$http
的承诺,看看事情是否符合您的需要:
this.validate = function(id, token) {
return $http({ ... });
}
然而,这可能还不够,因为即使来自$http
的承诺成功,您有时也需要重定向。每当您想要阻止加载状态时,您应该拒绝承诺。
因此,您最终可能需要返回使用$q
服务手动创建的承诺,然后解析它(可能使用true
,如果您需要控制器来查看该布尔值),或拒绝它(在这种情况下控制器永远不会加载)。
过去,当使用ui-router
时,我有时不得不像$timeout
中的实际重定向一样做hacky事情,或者添加一个事件处理程序来捕获发生的路由错误当一个承诺被拒绝,并在那里进行重定向。我不确定你是否必须在这种情况下做其中任何一个,但我想提到它。