仅在异步方法完成时呈现页面

时间:2015-06-30 08:12:31

标签: javascript angularjs angular-ui-router

我的问题与此类似:stop angular-ui-router navigation until promise is resolved

但是,答案似乎都没有解决这个问题。

我的应用程序存储带有令牌的cookie。当加载页面时(例如在F5之后),应用程序检查cookie,如果找到,则使用令牌加载从Web服务加载的用户设置。需要这些设置才能从我的控制器将调用的其他Web服务获取所有其他信息,因此必须在页面呈现之前加载设置。

这是我目前的代码:

    $rootScope.$on( '$stateChangeStart', function(e, toState, toParams, fromState, fromParams) {
        e.preventDefault();

        authentication.checkCookie(function() {
            if (toState.name == 'login'){
                if(authentication.getLoginData()) {
                    //e.preventDefault();
                    $state.go('pricelist');
                }
            } else {
                if(!authentication.getLoginData()) {
                    //e.preventDefault();
                    $state.go('login');
                }
            }

            // No redirect is needed - now render the page requested
            $urlRouter.sync();
        });

    });

不幸的是,这段代码不起作用:它只会导致无限循环。

如何检查cookie并加载用户设置(这也可以在checkCookie中完成),我怎样才能确保渲染仅继续?

1 个答案:

答案 0 :(得分:0)

我已通过在上述链接中使用另一个答案设法解决了这个问题:

    $rootScope.$on( '$stateChangeStart', function(e, toState, toParams, fromState, fromParams) {
        if ($rootScope.stateChangeBypass) {
            $rootScope.stateChangeBypass = false;
            return;
        }

        e.preventDefault();

        authentication.checkCookie(function() {
            $rootScope.stateChangeBypass = true;
            if (toState.name == 'login'){
                if(authentication.getLoginData()) {
                    $state.go('pricelist');
                } else {
                    $state.go(toState, toParams);
                }
            } else {
                if(!authentication.getLoginData()) {
                    $state.go('login');
                } else {
                    $state.go(toState, toParams);
                }
            }
        });

    });

它不是一个干净的解决方案,但它确实有效。