Функция разрешения в состояниях $ stateProvider выполняется дважды - PullRequest
2 голосов
/ 09 апреля 2019

Я использую angularJs версии 1.4.5 и angular-ui-router версии 0.2.18 в моем приложении. Я заметил, что мои функции разрешения выполняются дважды для состояния.

Я также пытался использовать обновленные версии angular-ui-router до 0.4.3, но проблема не решена.

Мое одно из определений состояния следующее:

$stateProvider
        .state('app', {
            url: '/',
            views: {
                '': {
                    resolve: {                            
                        usersList: function() {
                            return MainService.getUsers().UsersData.$promise.then(
                                function(response) {
                                    return response;
                                }
                            );
                        }
                    },
                    templateUrl: 'app/views/main/main.html',
                    controller: "MainController"
                }
            }
        })

Функции разрешения не должны выполняться дважды. Это должно быть выполнено только один раз.

Я также заметил, что мы сначала проверяем, есть ли у пользователя доступ к странице, а затем перенаправляем на нее. Я создал образец plunkr, в котором показано, что разрешенная функция выполняется дважды: http://next.plnkr.co/edit/evuQuRxYwCNwhAPw?open=lib%2Fscript.js&preview

1 Ответ

0 голосов
/ 18 апреля 2019

Проблема здесь (имеется в виду ваш plnkr ) заключается в том, что маршрут по умолчанию - route1, поэтому приложение сразу переходит к этому при загрузке.В то же время у вас есть асинхронный вызов API в блоке выполнения, чтобы проверить, авторизован ли пользователь для route1.Как только обещание по этому вызову API разрешено, приложение перенаправляет на route1 во второй раз, предоставляя вам двойное разрешение.

Подход, согласно которому route1 является маршрутом по умолчанию, не имеет смысла, если для этого маршрута требуется авторизацияэто может отсутствовать.Я бы предложил:

  • Наличие состояния по умолчанию подобно переключателю, который перенаправляет либо на route1, либо на какой-либо другой маршрут (независимо от того, что видит неавторизованный пользователь) в зависимости от авторизованного состояния пользователя.Логика перенаправления может быть в контроллере коммутатора.
  • Реализация обработчика для '$ ​​stateChangeStart', который проверяет авторизацию пользователя и перенаправляет его, если он не авторизован (обязательно сохраните его статус авторизации где-то вконечно, чтобы вы не вызывали этот асинхронный API каждый раз!)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...