这是我的.run功能:
.run(function ($transitions, UserService) {
$transitions.onStart({ to: function(state) {
return state.data != null && state.data.requireLogin === true && UserService.getUser().isLogged !== true;
}},function(trans){
var AuthService = trans.injector().get('AuthService');
var $q = trans.injector().get('$q');
var $state = trans.injector().get('$state');
var defer = $q.defer();
AuthService.login().then(function (status){
if(status === 'login'){
defer.resolve(true);
}else if (status === 'register'){
defer.resolve($state.target('map.register'));
}
}, function (msg){
// Here is part that I am asking for
defer.resolve(false);
});
return defer.promise;
});
});
基本上,如果转换到需要登录且未登录用户的状态,则使用transitionHookFn
。在那里,我使用AuthService.login()
并返回状态承诺。如果AuthService.login()
失败(用户取消),则promise将返回false并取消转换,从而使用户处于相同的状态。
当用户在首次加载时尝试访问受限页面并取消登录时问题开始,因为没有先前的状态且整个页面只是空白。
如果有先前的状态,是否有办法取消转换,如果没有,则重定向到主页?我需要访问以前的状态,看看它是否存在。
答案 0 :(得分:0)
要重定向到主页,您可以使用
app.config(function($urlRouterProvider){
$urlRouterProvider.otherwise('YOUR-HOME-STATE');
});
您也可以使用
app.run(function($transitions, SOME-SERVICE) {
$transitions.onSuccess({ to: 'SOME-STATE' }, function(trans) {
//Here you can call your service and based on conditions
//you can make transition to previous state by calling its name
//or to your default state
if(SOME-CONDITION){
return trans.router.stateService.go('PREVIOUS-STATE');
} else {
return trans.router.stateService.go('DEFAULT-STATE');
}
});
});
请注意,您也可以使用stateParams
更好地用作$transition$
参数:
trans.params().PARAM-NAME