Выход Angular с именем маршрутизатора работает не так, как ожидалось

#angular #angular2-routing #router-outlet #ng-component-outlet

#angular #angular2-маршрутизация #маршрутизатор-выход #ng-component-outlet

Вопрос:

У меня есть проект angular со следующей структурой маршрутизации, начиная с корня приложения:

   // app-routing.module.ts
  const routes: Routes = [
    {
      path: 'admin',
      loadChildren: () => import('./features/admin/admin.module').then((m) => m.AdminModule)
    },
  ];
  // Import and export...

  // admin-rounting.module.ts
  const routes: Routes = [
    {
      path: 'admin',
      component: ShellComponent,
      children: [
        {
          path: 'editor',
          loadChildren: () => import('./editor/editor.module').then((m) => m.EditorModule),
        },
      ],
    },
  ];
  // Import and export...

  // editor-routing.module.ts
  const routes: Routes = [
    {
      path: '',
      component: EditorComponent,
    },
    {
      path: 'view-profile',
      component: ViewProfileComponent,
      outlet: 'profile',
    },
    {
      path: 'edit-profile',
      component: EditProfileComponent,
      outlet: 'profile',
    },
  ];
  // Import and export...
 

Корневая розетка, в AppComponent которой она находится, впоследствии ShellComponent содержит другую розетку маршрутизатора, которая передается как содержимое в a SidebarComponent , которое отображает его в a mat-sidenav-content , что-то вроде этого:

     // app.component.html
    <router-outlet><router-outlet>

    // shell.component.html
    <sidebar>
        <router-outlet outlet></router-outlet>
    </sidebar>

    // sidebar.component.html
    <mat-sidenav-content>
        <div class="content">
            <ng-content select="[outlet]"></ng-content>
        </div>
    </mat-sidenav-content>
 

Поэтому, когда я перехожу к /admin/editor все работает так, как ожидалось: я вижу ShellComponent , и EditorComponent отображается в нужном месте. Проблема начинается внутри EditorComponent . Этот компонент содержит <profile></profile> , где я хочу отобразить компонент <view-profile></view-profile> или <edit-profile></edit-profile> , используя названную розетку profile (как вы можете видеть в EditorRoutingModule конфигурации. Здесь код:

    // editor.component.html
   <profile></profile>

   // profile.component.html
   <router-outlet name="profile"></router-outlet>

   // profile.component.ts
   ngOnInit(): void {
      this.router.navigate([{ outlets: { profile: ['view-profile'] } }], { relativeTo: this.route });
   }
 

ProfileComponent Загружается, но я не вижу того <view-profile></view-profile> , что ожидаю. Просматривая HTML, я вижу выход профиля там, где я его ожидаю.

Есть какие-либо предложения по этому поводу?

Ответ №1:

Пришлось оставить свойство path пустым, как это..

 { path: '', component: ViewProfileComponent, outlet: 'view-profile', pathMatch: 'full' }
 

Ответ №2:

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

   const routes: Routes = [
    {
      path: 'outlets',
      component: EditorComponent,
      children: [
        { path: 'view-profile', component: ViewProfileComponent, outlet: 'profile' },
        { path: 'edit-profile', component: EditProfileComponent, outlet: 'profile' },
      ],
    },
    { path: '', redirectTo: 'outlets', pathMatch: 'full' },
  ];
 

Мне это не нравится полностью, потому что мой маршрут выглядит так /admin/editor/outlets/(profile:edit-profile) , возможно ли достичь того же результата без /outlets/ части в маршруте?