У меня есть маршрут в маршрутизаторе root до go, через который мне нужно проверить в Guard.
app-routing.module.ts
{
path: 'toys',
component: ToysComponent,
},
{
path: 'clothes',
canActivate: [ClothesGuard],
loadChildren: ()=> import('../clothes/clothes.module')
.then((m) => m.ClothesModule)
}
clothing-routing.module.ts:
{
path: '',
component: ClothesComponent
},
{
path: 'shirts',
loadChildren: ()=> import('../shirts/shirts.module')
.then((m) => m.ShirtsModule)
}
shirts-routing.module.ts
{
path: '',
component: ShirtsComponent
}
Это отлично работает, когда я go из root путь к / одежду или со страницы / игрушки на / одежду . Но. Если я перейду по ссылке со страницы / одежду на / одежду / рубашки , а затем нажму кнопку «Назад» в браузере ИЛИ щелкну ссылку
<a routerLink="/clothes">
, затем ClothesGuard не будет называться , а страница / clothing все равно откроется.
Чтобы исправить это, я расширил ClothesGuard с помощью интерфейса CanDeactivate , где я проверяю, равен ли nextState.url / clothing . И добавил в роутер:
shirts-routing.module.ts
{
path: '',
component: ShirtsComponent,
canDeactivate: [ClothesGuard]
}
Теперь все работает отлично, и проверка выполняется каждый раз при нажатии на / clothing ссылка со страницы / clothing / shirts .
Но теперь мне нужно добавить эту защиту CanDeactivate на все пути внутри / одежду маршрут, например
/ одежда / джинсы
/ одежда / костюмы
/ одежда / юбки et c.
Есть ли лучший способ выполнить такую же проверку при переходе на страницу, независимо от того, был ли нажат дочерний маршрут, родственный маршрут или кнопка возврата браузера?