Вы можете сопоставить DetailsComponent с маршрутом /feature/details
и использовать маршрут :id
в качестве дочернего элемента маршрута детали.В DetailsComponent вы должны использовать вкладки материалов с маршрутизацией
в модуле маршрутизации
const routes: Routes = [
{
path: 'feature',
children: [
{
path: 'list',
component: ListComponent
},
{
path: 'details',
component: DetailsComponent,
children: [
{
path: ':id',
component: TabIdComponent,
data:
{
title: 'Detail',
}
},
{
path: 'list',
component: ListComponent,
data:
{
title: 'List',
}
},
...
{
path: '',
redirectTo: 'list',
pathMatch: 'full'
},
]
},
...
]
}
];
в details.component.html
<nav mat-tab-nav-bar>
<a mat-tab-link
*ngFor="let tab of tabs"
[routerLink]="tab.link"
routerLinkActive
#rla="routerLinkActive"
[active]="rla.isActive"
>
{{ tab.label }}
</a>
</nav>
<router-outlet></router-outlet>`
Чтобы получить список вкладокиз конфигурации маршрутизатора вы перечисляете его из ActivatedRoute
в файле details.component.ts
public tabs: Tab[];
constructor(activatedRoute: ActivatedRoute) {
activatedRoute.paramMap.subscribe(value => {
this.tabs = new List(activatedRoute.snapshot.routeConfig.children)
.Where(r => r.path !== '')
.Select(r => new Tab(r.path, r.data.title)).ToArray();
});
}
...
export class Tab {
link: string;
label: string;
constructor(link: string, label: string) {
this.label = label;
this.link = link;
}
}
Если вы не хотите, чтобы ListComponent загружался в первичную розетку (даже при переходе на *)1015 *) вы можете перенаправить его на /feature/details/list
вместо определения компонента для этого маршрута, используя
{
path: 'list',
redirectTo: 'details/list',
pathMatch: 'full'
}