$ stateChangeStart - 未阻止状态更改

时间:2016-06-12 18:43:34

标签: angularjs angular-ui-router

如果未经授权的用户尝试访问受限状态,则受限制状态会在$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);
        });
    }
});

1 个答案:

答案 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();
    }
}

但是,当然,这意味着您的服务需要同步返回布尔值,而不是承诺。