Как мне перенаправить на дочерний маршрут от охранника родительского маршрута, одновременно защищая дочерние маршруты от прямого доступа *?
Проблема с абсолютной навигацией, защита родительского компонента вызывается снова в цикле при переходе к дочернему маршруту.
Проблема с относительной навигацией заключается в том, что охранник защищает родительский маршрут, поэтому еще нет активированного маршрута, относительно которого можно было бы перемещаться. Также это, вероятно, не защитит дочерние маршруты. Возможно, тот же охранник можно было бы использовать с дочерними маршрутами или с CanActivateChildren.
Пример Stackblitz: https://stackblitz.com/edit/angular-qbe2a7
маршруты
const appRoutes: Routes = [
{
path: 'foo',
component: FooComponent,
canActivate: [ RedirectionGuard ],
children: [
{
path: 'foo-child',
component: FooChildComponent
}
]
}
];
canActivate () на страже
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean>|Promise<boolean>|boolean {
console.log('guard: ', route, state, this.route);
// idea: create own ActivatedRoute and give it the values from ActivatedRouteSnapshot which knows about 'foo/'
const foo: ActivatedRoute = new ActivatedRoute();
console.log(foo);
// Error: Cannot match any routes
// I think because there is no route to be relative to when canActivat is called. Router has not yet navigated to '/foo/'
this.router.navigate(['../foo-child'], { relativeTo: this.route
});
// Errors with infinite loop because '/foo/' has this guard which will then be called again
//this.router.navigate(['/foo/foo-child']);
// navigate returns true also. maybe just return that.
return true;
}
* Почему бы не добавить охранников ко всем детям, спросите вы. Мне нужно перенаправить с родительского маршрута на множество разных дочерних маршрутов в зависимости от состояния приложения. В настоящее время я использую один из дочерних маршрутов для перенаправления с этого компонента, но это не защищает дочерние маршруты от прямой навигации пользователя.