Я разрабатываю приложение, в котором мне нужны разные макеты страниц в зависимости от маршрута, в котором я сейчас нахожусь. В частности, у меня есть компонент BaseLayout, в который я хочу загрузить другие компоненты компоновки, а затем загрузить содержимое страницы. Вот пример:
<mat-sidenav-container class="example-sidenav-container">
<mat-sidenav #snav mode="'over'" fixedInViewport [fixedTopGap]="isXSmall ? 56 : 64">
// Sidenav content
</mat-sidenav>
<mat-sidenav-content>
// load this components depending on route
<app-toolbar></app-toolbar> // load toolbar depending on route
<app-header></app-header> // load header depending on route
<app-content></app-content> // contains a router-outlet where I want to display page content
</mat-sidenav-content>
</mat-sidenav-container>
Так, например: когда я перехожу к / home, я хочу этот макет, где отображаются только панель инструментов и контент. Вот мой app.route:
export const AppRoutes: Routes = [
{
path: 'home',
component: BaseLayoutComponent,
loadChildren: () => import('./main/pages/home/home.module').then(m => HomeModule)
}
]
А вот мой home.routes:
const routes: Routes = [
{
path: '',
component: HomeComponent
}
];
Моя проблема заключается в динамической загрузке отдельных частей макета BaseLayout. Я не уверен, какая должна быть оптимальная конфигурация маршрутов.
РЕДАКТИРОВАТЬ: Это то, что я пытался: app.routes:
{
path: 'home',
component: BaseLayoutComponent,
children: [
{
path: '',
component: ToolbarComponent,
outlet: 'toolbar'
},
{
path: '',
component: HeaderComponent,
outlet: 'header'
},
{
path: '',
loadChildren: () => import('./main/pages/home/home.module').then(m => HomeModule)
}
]
}
И в моем BaseLayoutComponent html:
<mat-sidenav-container class="example-sidenav-container">
<mat-sidenav #snav mode="'over'" fixedInViewport [fixedTopGap]="isXSmall ? 56 : 64">
Sidenav content
</mat-sidenav>
<mat-sidenav-content (scroll)="onScroll($event)">
<router-outlet name="toolbar"></router-outlet>
<router-outlet name="header"></router-outlet>
<app-content></app-content>
</mat-sidenav-content>
</mat-sidenav-container>
Это работает, но опять же я не уверен, что это правильный подход.