ui-router $ stateChangeStart上的无限循环

时间:2014-04-10 18:52:59

标签: angularjs angular-ui-router

加强角度 ui-router

如果不满足前提条件,就会挣扎着重定向到另一个州:

我尝试使用拦截器:(How do I preform a redirect in an angular interceptor)。

但是有人提到处理$ 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');
                }
            })
        }
    });

任何人都可以提出更好的模式(一种有效的模式)

谢谢!


注意:此处有类似问题的不同方法:How do I preform a redirect in an angular interceptor

1 个答案:

答案 0 :(得分:1)

我不认为你尝试这样做的一般方式有什么不妥,尽管我不是专家。我确实看到了实现中的一个缺陷,看起来它可能导致无限循环。我们假设用户试图访问“user.new”#39;州。您的$ stateChangeStart侦听器拦截它,取消它,执行您的customGET;然后,如果内部if条件为真(resp.hasOwnProperty('id')),则尝试将用户发送给相同的“user.new”#39;州。此时,您的$ stateChangeStart侦听器会一遍又一遍地拦截它,取消它等。

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