Я работаю над проектом по преобразованию приложения AngularJS в Angular, и я сталкиваюсь с блокировщиком маршрутизации.
TL / DR: Мне нужно определить маршруты на основе ответа API перед использованием модуля маршрутизации.
Рабочий сценарий в AngularJS: (Тип псевдокода далее ниже)
Есть несколько базовых маршрутов, которые существуют для всех, они определены стандартным AngularJS способом:
/home
/settings
...etc
Затем есть динамические c маршруты которые создаются на основе ответа API
/purchase-requests
/invoices
/godzilla
...etc. Content doesn’t matter, basically, a dynamic list of routes that an existing API gives as an array of strings
Основной c рабочий процесс существующего AngularJS приложения:
- AngularJS приложение НЕ привязывается к элементу сразу с помощью ng-app, как это обычно делается.
- Необработанный (или jQuery) ответ получен от API при загрузке страницы.
- Приложение AngularJS инициализируется с использованием:
angular.bootstrap(document.getElementById('mainElementId'),[‘appName']);
Это работает из-за того, что AngularJS не вызывает .config () при загрузке. бу t на bootstrap приложения angular, которое мы откладываем до ответа API.
Пример AngularJS, который работает сегодня:
<script>
let appList = [];
const mainApp = angular.module('mainApp', ['ngRoute']);
// Controllers
mainApp.controller('mainController', mainController);
mainApp.controller('homeController', homeController);
mainApp.controller('appListController', appListController);
mainApp.controller('appSingleController', appSingleController);
mainApp.controller('errorController', errorController);
// config will not be called until the app is bootstrapped
mainApp.config(function($routeProvider) {
// Default routes that everyone gets
$routeProvider.when('/', { templateUrl: 'views/home.html', controller: 'homeController'});
$routeProvider.when('/home', { templateUrl: 'views/home.html', controller: 'homeController'});
// Add the dynamic routes that were retreived from the API
for (let appName in appList) {
$routeProvider.when(`/${appName}`, { templateUrl: 'views/app-list.html', controller: 'appListController'});
$routeProvider.when(`/${appName}/new`, { templateUrl: 'views/app-single.html', controller: 'appSingleController'});
$routeProvider.when(`/${appName}/view/:itemNumber`, { templateUrl: 'views/app-single.html', controller: 'appSingleController'});
}
$routeProvider.otherwise({ templateUrl: 'views/error.html', controller: 'errorController'});
});
$(document).ready(function() {
const options = {
type: 'GET',
url: '/api/apps/getAvailableApps',
success: onAppSuccess,
};
$.ajax(options);
});
function onAppSuccess(response) {
appList = response.appList;
angular.bootstrap(document.getElementById('mainApp'), ['mainApp']);
}
</script>
<!-- Typically, you bind to the app using ng-app="mainApp" -->
<div id="mainApp" class="hidden" ng-controller="mainController">
<!-- Route views -->
<div ng-view></div>
</div>
In Angular 9 (или, казалось бы, любая последняя версия Angular), маршруты определяются в модуле маршрутизации перед инициализацией основного компонента:
const routes: Routes = [
{ path: 'login', component: LoginComponent },
{ path: '', component: DashboardComponent },
{ path: 'home', component: DashboardComponent },
{ path: 'settings', component: SettingsComponent },
];
Использование router.resetConfig
не работает
Допустим, у меня основной модуль сначала загружает конфигурацию API, а затем использует resetConfig
в зависимости от ответа. Это отлично работает, если первая страница, которую загружает пользователь, - это /
или /home
или один из других предопределенных маршрутов: создаются новые маршруты Dynami c и навигация по ним работает.
Однако, если пользователь переходит непосредственно к маршруту, который не определен заранее (скажем, / godzilla), маршрутизатор даже не позволяет загрузиться странице (или), если задан маршрут с подстановочными знаками, вызывает сообщение 404. ngOnInit () в основном компонент (который я пытался использовать для загрузки ответа API) никогда не запускается.
Вопрос: Как я могу создать маршруты на основе ответа API перед навигацией маршрутизатора выполняется или даже инициализируется?