Моя цель: я хотел бы глобально прослушивать события маршрутизатора NavigationEnd и изменять заголовок веб-страницы в зависимости от пользовательских данных маршрута.
Текущий код (в app.component.ts):
this.router.events.pipe(
filter((ev) => ev instanceof NavigationEnd),
map(() => this.activatedRoute),
map((route) => {
while (route.firstChild) route = route.firstChild;
return route;
}),
filter((route) => route.outlet === 'primary'),
mergeMap((route) => route.data),
).subscribe((event) => this.title.setTitle(event['title']));
взято из этого урока
Приведенный выше код работает, но совсем не элегантно, посмотрите на необходимую конфигурацию маршрутизации:
app- routing.module.ts
const routes: Routes = [
{
path: 'user',
loadChildren: () => import(`./user/user.module`).then(m => m.UserModule),
data: { title: "Pagina Utente" }
},
{
path: 'admin', loadChildren: () => import(`./admin/admin.module`).then(m => m.AdminModule),
data: { title: "Pannello Admin" }
},
{ path: '**', component: HomeComponent },
];
admin-routing.module.ts:
const routes: Routes = [
{
path: '', component: AdminPanelComponent,
children: [
{
path: 'users', component: UsersComponent,
data: { title: 'Pannello Admin: Utenti' }
},
{
path: 'comuni', component: ComuniComponent,
data: { title: 'Pannello Admin: Comuni' }
},
]
}
];
Как вы можете видеть, я уже указал, что для маршрута / admin должен быть "Pannello Admin" как заголовок, но мне нужно писать его снова и снова для каждого из его дочерних маршрутов.
Я попытался исправить эту проблему, изменив код app.component.ts следующим образом:
this.router.events.pipe(
filter((ev) => ev instanceof NavigationEnd),
map(() => this.activatedRoute),
map((route) => {
let title = route.data['title'] || '';
while (route.firstChild) {
route = route.firstChild;
title+= route.data['title'];
}
return route;
}),
filter((route) => route.outlet === 'primary'),
mergeMap((route) => route.data),
).subscribe((event) => this.title.setTitle(event['title']));
Я ожидал, что этот код будет работать, и установил в качестве заголовка конкатенацию свойства data ['title'] соответствующих маршрутов. Однако это не работает и просто выдает пустые заголовки (данные ['title'] всегда по какой-то причине не определены)