Отображать страницу только после завершения асинхронного метода

0

Мой вопрос аналогичен, так что этот: остановка углового-ui-router навигации до тех пор, пока обещание не будет разрешено

Тем не менее, ни один из ответов, похоже, не решает эту проблему.

В моем приложении хранится файл cookie с токеном. Когда страница загружается (например, после F5), приложение проверяет файл cookie, и если он найден, он использует токен для загрузки пользовательских настроек, которые загружаются из веб-службы. Эти настройки необходимы для получения всей другой информации из других веб-служб, которые вызовут мои контроллеры, поэтому параметры должны быть загружены до того, как страница может отобразиться.

Это мой текущий код:

    $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)?

Теги:
angular-ui-router

1 ответ

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);
                }
            }
        });

    });

Это не очень чистое решение, но оно работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню