为什么stateChangeStart事件被调用两次?

时间:2016-02-22 08:05:57

标签: angularjs angular-ui-router

我在更改状态时使用$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再次被触发,所以我需要通过布尔参数返回或者进入无限循环... 为什么呢?

1 个答案:

答案 0 :(得分:1)

我建议您查看有关UI路由器和身份验证的一些文章,但是您可以将$state.go()替换为$state.transitionTo()并将notify选项设置为false以避免广播$stateChangeStart事件

有趣的文章: