我的状态如下:
.state('core.recover', {
url: '/recover',
controller: 'RecoverPasswordCtrl',
templateUrl: 'views/tmpl/recoverAccount/recover-password.html'
})
我希望当我在加载模板之前进入此状态检查某些内容时,在这种情况下我想调用一个api来检查一些东西,如果promise是成功的,它将继续并显示模板,否则它将重定向用户到另一个州。
我尝试在控制器的顶部执行此操作,但我总是看到模板片刻,然后重定向我,所以我尝试使用此帖子中的解决方法:
AngularJS | handle routing before they load
如下:
.state('core.recover', {
url: '/recover',
controller: 'RecoverPasswordCtrl',
resolve: function(recoverAccountService, $location, $state, $q) {
var deferred = $q.defer();
deferred.resolve();
recoverAccountService.get({email:$location.search().email, verificationKey:$location.search().verificationKey})
.$promise.then(function (result) {}).catch(function (err) {
$state.go("candidature.pre");
});
return deferred.promise;
},
templateUrl: 'views/tmpl/recoverAccount/recover-password.html'
})
但它没有工作,我在浏览器的控制台中收到此错误:
Error: 'invocables' must be an object
我该如何解决这个问题?
答案 0 :(得分:2)
您没有使用正确的语法,resolve
期望作为aimadResolver
对象的条目,它将尝试评估哪个键。
让我们将您的解析功能缩写为var aimadResolver = function(recoverAccountService, $location, $state, $q) {
var deferred = $q.defer();
deferred.resolve();
recoverAccountService.get({ email: $location.search().email, verificationKey: $location.search().verificationKey })
.$promise.then(function(result) {}).catch(function(err) {
$state.go("candidature.pre");
});
return deferred.promise;
}
,例如
state('core.recover', {
url: '/recover',
controller: 'RecoverPasswordCtrl',
resolve: {'yourResolverName': aimaidResolver}
},
templateUrl: 'views/tmpl/recoverAccount/recover-password.html'
})
当然,这不是强制性的,但我是为了便于阅读而这样做。然后,您的州定义应如下所示:
yourResolverName
不要忘记在RecoverPasswordCtrl
中注入recoverAccountservice.get()
,否则您的控制器将无需等待即可实例化。资料来源:look for the resolve examples
侧面
我想指出你使用延迟对象没有意义。您将立即在函数的第二行解析延迟对象,这意味着RecoverPasswordCtrl
在recoverAccountservice.get()
已被实例化时仍可能处于暂挂状态。假设var aimadResolver = function(recoverAccountService, $location, $state, $q) {
return recoverAccountService.get({... })
.then(function(result) {
// do nothing? Apparently you only want to $state.go on a rejection of the promise
})
.catch(function(err) {
$state.go("candidature.pre");
return $q.when()
})
}
返回一个promise(如果没有,你应该更改它),你可以更有效地写:
$q.when()
有关使用deferred
与{{1}}的更多信息,请here。