Розетка маршрутизатора с угловым именем не работает должным образом
У меня есть проект 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
содержит другой выход маршрутизатора, который передается как содержимое
SidebarComponent
который отображает его в
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, я вижу выход профиля там, где я ожидал.
Есть предложения по этому поводу?
2 ответа
Я заставил это работать, но я не знаю, должно ли это быть так или это обходной путь. Во всяком случае, я дал
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/
участие в маршруте?
Пришлось оставить свойство path пустым вот так..
{ path: '', component: ViewProfileComponent, outlet: 'view-profile', pathMatch: 'full' }