Динамическая маршрутизация на основе внешних данных

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

  • ng2 inits с приложением
  • Приложение содержит заголовок, роутер-выход и нижний колонтитул
  • маршрут по умолчанию настроен на homeComponent
  • homeComponent имеет категорииListComponent
  • categoryListComponent вызывает метод get из категорийService
  • categoryService возвращает список категорий из api
  • categoryComponent отображает список и вводит новые маршруты для каждой категории обратно в приложение через routeConfigurator

На самом деле есть еще один слой абстракции с помощью routeService, но это не нужно для этого примера.

Эта часть работает, так как мы начали на домашней странице, был сделан вызов api и создан routerConfigs для каждой категории. Поэтому, когда пользователь нажимает на категорию, маршрут уже настроен с правильными метаданными категорииComponent + и отображается правильная информация.

Однако, если доступ к определенной странице категории напрямую, ng2 еще не имеет routerConfig для этого маршрута, так как вызов api ничего не вернул, не говоря уже о запуске. Ng2 просто предоставляет базовое приложение с заголовком, нижним колонтитулом и пустым маршрутизатором.

Единственное решение, о котором я могу думать, довольно «хакерское». Храните кешированный json-файл на сервере приложений и загружайте его в исходный html, а затем вставьте его в службу в ng2 bootstrap / init. Таким образом, маршруты настраиваются перед ng2 даже существами для отображения страницы.

Я прошу о любых других возможных предложениях, возможно, о том, что у меня есть немного больше возможностей ng2, которые я могу прослушивать. Возможно, это уже было решено, и я просто не усовершенствовал свой google-fu.

Заранее спасибо.

В новом маршрутизаторе ( >= RC.3 ) https://angular.io/docs/ts/latest/api/router/index/Router-class.html#!#resetConfig-anchor resetConfig можно использовать для загрузки новых маршрутов

 router.resetConfig([ { path: 'team/:id', component: TeamCmp, children: [ { path: 'simple', component: SimpleCmp }, { path: 'user/:name', component: UserCmp } ] } ]); 

У вас будет настраиваемая директива routerLink или только какая-либо ссылка или кнопка, которая вызывает обработчик событий при щелчке, где загружаются новые маршруты, а затем router.navigate(...) вызывается для перехода к соответствующему маршруту.

https://github.com/angular/angular/issues/11437#issuecomment-245995186 предоставляет RC.6 Plunker

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

Я создал файл javascript, где я добавляю свои маршруты.

 "use strict"; const home_component_1 = require("location javascript component file"); exports.DYNAMIC_ROUTES = [ { path: '', component: your_component_name_component_1.YourComponentName }, ] 

Затем в файле app.routing.ts (ваш файл маршрутизации) вам нужно будет добавить оператор импорта в файл javascript

 // JAVASCRIPT IMPORT import { DYNAMIC_ROUTES } from 'location javascript file'; const appRoutes: Routes = [ { path: 'home', component: NormalLayoutComponent, children: DYNAMIC_ROUTES }, ] 

Таким образом, используя этот метод, вы теперь можете манипулировать файлом javascript с помощью TypScript для динамических изменений. Вы даже можете создать файл по php, а затем сохранить его в одном месте. Обратите внимание, что вам нужно иметь уже скомпилированный компонент, в моем случае есть один, и он обрабатывает все маршруты в одном компоненте для меня.

Также убедитесь, что если вы используете компилятор, который удаляет ваш javascript, обязательно прочитайте их в папке сборки или убедитесь, что он компилируется вместе с вашим приложением.

  • Страница обновления Angular2 router.navigate обновить
  • Угловой маршрутизатор поддерживает строку запроса
  • Angular2: Сделать дорожки нечувствительными к регистру
  • Угловое 2: получение RouteParams из родительского компонента
  • Функция Angular2 canActivate (), вызывающая функцию async
  • Как передать параметры запроса с помощью routerLink в новом Router V 3 alpha (владивосток)
  • Interesting Posts
    Давайте будем гением компьютера.