我在更改状态时使用$stateChangeStart
作为检查用户。
这是我的代码
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams, options) {
if (!toState.data.require_authentication) {
return;
}
// Because state change is called two times, to prevent infinite loop I remove is_authenticate for next re-check and return
if (toState.data.is_authenticate) {
toState.data.is_authenticate = false;
return;
}
event.preventDefault();
toState.data.is_authenticate = false;
// Check validity of token
authService.checkAuthToken(function(result, status) {
if (result.fn.result.done) {
toState.data.is_authenticate = true;
//$state.go(toState, toParams, options);
$state.go(toState, toParams);
} else {
$log.debug("AuthToken expire/wrong");
storageService.reset();
$state.go("page.login");
}
return;
});
});
通过一些控制台日志,我看到当$ state.go被触发时,由于某种原因$stateChangeStart
再次被触发,所以我需要通过布尔参数返回或者进入无限循环...
为什么呢?
答案 0 :(得分:1)
我建议您查看有关UI路由器和身份验证的一些文章,但是您可以将$state.go()
替换为$state.transitionTo()
并将notify
选项设置为false以避免广播$stateChangeStart
事件
有趣的文章: