$ stateChangeStart - 未阻止状态更改

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了$ stateChangeStart - 未阻止状态更改相关的知识,希望对你有一定的参考价值。

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

你从异步回调中调用event.preventDefault()。因此,在调用时,事件侦听器函数已经返回,并且由于事件未被阻止,因此路由器已导航到下一个状态。

如果你这样做会有用

$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
    if ((toState.name == 'app.admin' || toState.name == 'app.bonus')
        && !AuthService.isAuthenticated()) {
        event.preventDefault();
    }
}

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

以上是关于$ stateChangeStart - 未阻止状态更改的主要内容,如果未能解决你的问题,请参考以下文章

$stateChangeStart 删除最初启用的 event.preventDefault

Angular Webpack ES2015 组件构建中未触发 angular-ui-router $stateChangeStart 事件

ui-router中使用$stateChangeStart来实现WEB用户登录跳转

记一次AngularJs 路由 $stateChangeStart不起作用(细节决定成败)

AngularJs Run块$ stateChangeStart未被触发

当 UI-Router ES6 中的状态更改时,$stateChangeStart 不会被触发?