Угловая вспомогательная маршрутизация, не работающая внутри модулей

#angular #angular2-routing #angular-auxiliary-routes

#angular #angular2-маршрутизация #угловые вспомогательные маршруты

Вопрос:

Я хотел бы использовать вспомогательную маршрутизацию Angular для (очень больших) боковых меню инструмента администрирования (используя угловую ветку 7.2.X). После нескольких дней тестов с ужасно сложным маршрутизатором Angular я смог заставить URL работать должным образом. Но когда я пытаюсь маршрутизировать между компонентами во вспомогательных выходах, у меня очень странное поведение…

Эскизы приложения, которые я получил от дизайнеров, довольно стандартны: одно общее фиксированное меню в верхней части, динамическое боковое меню слева и второе динамическое боковое меню справа.

Мой модуль маршрутизации приложений в настоящее время представляет собой что-то вроде :

 const appRoutes: Routes = [
  {path: 'login', component: LoginComponent},
  {path: 'person', component: MainComponent, loadChildren: 'app/person/person.module#PersonModule'},
  // several other modules, some eager loaded, other lazy loaded
  {path: '**', redirectTo: '/login'}
];
  

Основной компонент содержит основные и именованные выходы маршрутизатора для разных модулей :

 <div class="main-container">
  <div class="left-container">
    <router-outlet name="left"></router-outlet>
  </div>
  <div class="middle-container">
    <router-outlet></router-outlet>
  </div>
  <div class="right-container">
    <router-outlet name="right"></router-outlet>
  </div>
</div>
  

И маршрутизация модуля person :

 const PERSON_ROUTES: Routes = [
  {path: 'display', component: PersonDisplayComponent},
  {path: 'first', component: MenuTestFirstComponent, outlet: 'right'},
  {path: 'second', component: MenuTestSecondComponent, outlet: 'right'},
  {path: 'third', component: MenuTestThirdComponent, outlet: 'right'},
  {path: '', component: MenuTestFirstComponent, outlet: 'right'},
  {path: '' pathMatch: 'full', redirectTo: 'display'},
];
  

Все эти маршруты работают должным образом (два первых отображают одно и то же из-за вспомогательного маршрута по умолчанию) :

  • / человек/дисплей
  • /person/(дисплей//справа:первый)
  • /человек/(дисплей//справа:второй)
  • /человек/(дисплей//справа:третий)

Теперь к проблемам! Мне нужно проложить маршрут между этими меню (у первого есть ссылка на маршрут во втором, а у второго есть ссылка на маршрут в третьем). Код, который я разместил в компонентах меню, следующий (здесь первый, но второй похож на маршрут к третьему) :

 <p><a [routerLink]="[{outlets:{right:['second']}}]">Second (routerLink)</a></p>
<p><a (click)="routeToSecond()">Second (route.navigate)</a></p>
  

И в TS :

 public routeToSecond(){
  this.router.navigate([
    {
      outlets: {
        right: ['second'],
      }
    }
  ]);
}
  

Проблема в том, что когда я включен /person/display , первое меню (которое используется по умолчанию) отображается правильно. routerLink Способом маршрутизации является правильное добавление ссылки на /person/(display//right:second) . Однако (clic) способ маршрутизации приводит к ошибке маршрутизатора :

 Error: Uncaught (in promise): Error: Cannot match any routes. URL Segment: 'second'
Error: Cannot match any routes. URL Segment: 'second'
  

Маршрут, который я запросил для routerLink и к router.navigate , строго одинаков, но один способ маршрутизации на данный момент работает, второй — нет.

Вторая проблема заключается в том, что когда я включен /person/(display//right:second) , ни одна из ссылок на third не работает. Ссылка, сгенерированная routerLink , странная :

 /person/(display//right:second/(right:third))
  

Я бы ожидал, что routerLink заменит right:second часть на right:third , а не добавит часть к вспомогательному URL.

Что касается router.navigate маршрутизации, я получаю аналогичную ошибку :

 Error: Uncaught (in promise): Error: Cannot match any routes. URL Segment: 'third'
Error: Cannot match any routes. URL Segment: 'third'
  

Большинство примеров вспомогательной маршрутизации, которые я нашел в Google, имеют существенные отличия от моего варианта использования. Они либо слишком просты (обычно только с одним AppModule), либо ссылки маршрутизации на вспомогательные выходы находятся за пределами модулей (в компонентах AppModule).

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

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

Возможно, я пропустил некоторую важную информацию о вспомогательной маршрутизации (или, в более общем плане, об угловом маршрутизаторе и маршрутизации, это совсем не просто). Если у вас есть какие-либо идеи по решению моей проблемы с маршрутизацией, это было бы потрясающе. Не стесняйтесь клонировать мой пример stackblitz, чтобы показать рабочий пример. Рефакторируйте столько, сколько хотите, если вам нужно изменить структуру модуля и / или компонента. Вспомогательной маршрутизации в сложной ситуации действительно не хватает подробной документации, поэтому, если ваш ответ может содержать какое-то объяснение, это было бы еще более потрясающе.

Спасибо всем вам, кто дочитал до этого момента 🙂