ui-router的$ stateChangeStart上的无限循环

Jon*_*han 5 angularjs angular-ui-router

角度ui路由器上加速

如果不满足前提条件,就要努力重定向到不同的状态:

我尝试使用拦截器:( 如何在角度拦截器中预先形成重定向).

但有人提到处理$ stateChangeState会更合适.但我仍然遇到无限循环:

    /**
     *  Check here for preconditions of state transitions
     */
    $rootScope.$on('$stateChangeStart', function(event, toState) {

        // which states in accounts to be selected
        var accountRequiredStates = ['user.list', 'user.new'];
        if(_.contains(accountRequiredStates, toState.name)){
            event.preventDefault();
            ApiAccount.customGET('get_current').then(function(resp){
                // if I have a selected account, go about your business
                if(resp.hasOwnProperty('id')){
                    $state.go(toState.name);
                } else { // prompt user to select account
                    $state.go('user.select_account');
                }
            })
        }
    });
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议一个更好的模式(一个有效)

谢谢!


注意:类似的问题不同的方法:如何在角度拦截器中预先形成重定向

Mat*_*lis 1

尽管我不是专家,但我认为您尝试执行此操作的一般方式没有任何问题。我确实看到了实现中的一个缺陷,看起来它可能会导致无限循环。假设用户尝试进入“user.new”状态。你的 $stateChangeStart 监听器拦截它,取消它,做你的 customGET; 然后,如果内部 if 条件为 true ( resp.hasOwnProperty('id')),则尝试将用户发送到相同的“user.new”状态。此时,您的 $stateChangeStart 侦听器会一遍又一遍地拦截它、取消它等等。

我在代码中避免此问题的方法是使用一个变量(在我声明侦听器的服务中)来帮助我绕过该检查: 在检查var middleOfRedirecting = false;内的内部 if 块内resp.hasOwnProperty('id'),将 middleOfRedirecting 设置为 true;在 $stateChangeStart 侦听器的开头添加一个条件,以便仅event.preventDefault()在 middleOfRedirecting 为 false 时调用和重定向。您还需要一个 $stateChangeSuccess 侦听器将 middleOfRedirecting 设置回 false,为下一个状态更改重置它。(我觉得应该有比这更好的方法,但至少有效。)