Как повторить запрос маршрута на событие $ stateNotFound в маршрутизаторе AngularUI

#javascript #angularjs #angular-ui #angular-ui-router

#javascript #angularjs #angular-пользовательский интерфейс #angular-ui-router

Вопрос:

У меня есть большое приложение AngularJS, которое разделено на разные функциональные модули. В настоящее время он объединен в один файл JavaScript, и, таким образом, все модули загружаются при начальной загрузке страницы. Я хочу разделить пакет по функциональным областям и загружать части приложения по требованию, когда пользователь достигает определенных точек (просмотров).

Я разобрался с объединением и отложенной загрузкой с помощью RequireJS и ocLazyLoad. Однако осталось решить последнюю проблему. Каждый модуль определяет свои собственные маршруты, поэтому, если я не загружу его при начальной загрузке, маршруты для него будут неопределенными, пока пользователь не достигнет точки, которая запускает загрузку модуля.

Проблема в том, что недостающий маршрут можно получить напрямую, просто вставив его URL, в этом случае маршрутизатор AngularUI выдаст событие $stateNotFound. У меня есть обработчик для него, который проверит запрошенный URL и загрузит соответствующий модуль (вместе с отсутствующими маршрутами). Последняя недостающая часть — после загрузки модуля и маршрутов повторить маршрут. Кто-нибудь знает, как этого добиться? В часто задаваемых вопросах маршрутизатора AngularUI есть раздел, который призван объяснить это, но он не заполнен.

Ответ №1:

Вероятно, вам следует использовать функцию «when» в $urlRouterProvider вместо того, чтобы перехватывать событие $ stateNotFound:

 $urlRouterProvider.when('/myUrl', ['$match', '$state', function($match, $state) {
    // do something, check for module loaded for example
    // ... and then transitionTo
    $state.transitionTo(state, $match);
}]);
  

Отложите $state.transitionTo до тех пор, пока не захотите (например, после предварительной загрузки модулей).

Но если вы действительно хотите использовать $stateNotFound, вы можете сделать это:

 $rootScope.$on('$stateNotFound', function(event, unfoundState, fromState, fromParams){ 
    event.preventDefault()
    // do your module load
    // ... and then transitionTo
    $state.transitionTo(unfoundState.to, unfoundState.toParams, unfoundState.options);
})