加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-17 18:07:53 所属栏目:安全 来源:网络整理
导读:在角度和ui路由器上加速 如果不满足前提条件,就要努力重定向到不同的状态: 我尝试使用拦截器:(How do I preform a redirect in an angular interceptor). 但有人提到处理$stateChangeState会更合适.但我仍然遇到无限循环: /** * Check here for precondit
在角度和ui路由器上加速

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

我尝试使用拦截器:(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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读