如果未经授权的用户尝试访问受限状态,则受限制状态会在$state.go(fromState.name)
发回之前进行。好像event.preventDefault();
似乎没有开火?
$rootScope.$on('$stateChangeStart',
function (event, toState, toParams, fromState, fromParams) {
if (toState.name == 'app.admin' || toState.name == 'app.bonus') {
AuthService.isAuthenticated().then(function (response) {
if (!response) {
event.preventDefault();
$rootScope.$broadcast(AUTH_EVENTS.notAuthenticated);
} else {
event.preventDefault();
if ('data' in toState && 'authorizedRoles' in toState.data) {
var authorizedRoles = toState.data.authorizedRoles;
if (!AuthService.isAuthorized(authorizedRoles)) {
$state.go(fromState.name, {}, {
reload: true
});
$rootScope.$broadcast(AUTH_EVENTS.notAuthorized);
}
}
}
}, function () {
event.preventDefault();
$rootScope.$broadcast(AUTH_EVENTS.notAuthenticated);
});
}
});
答案 0 :(得分:0)
您正在从异步回调中调用event.preventDefault()
。因此,在它被调用时,事件监听器功能已经返回,并且由于事件没有被阻止,路由器已经导航到下一个状态。
如果你做了
就行了$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
if ((toState.name == 'app.admin' || toState.name == 'app.bonus')
&& !AuthService.isAuthenticated()) {
event.preventDefault();
}
}
但是,当然,这意味着您的服务需要同步返回布尔值,而不是承诺。