#angular #angular-routing
#angular #angular-маршрутизация
Вопрос:
Я пытался выяснить, как это сделать, когда все мои угловые маршруты имеют добавленный к ним параметр.
Мои маршруты выглядят так:
const routes: Routes = [
{ path: '', component: HomePageComponent },
{
path: ':gymId',
children: [
{ path: 'login', component: UserLoginComponent },
{ path: 'profile', component: UserProfileComponent, canActivate: [AuthGuard] },
{
path: 'users',
children: [
{
path: ':userId',
children: [
{
path: '',
component: UserProfileComponent,
},
]
},
]
},
{
path: 'events',
children: [
{ path: '', component: EventsListComponent },
{
path: ':eventId',
children: [
{
path: '',
component: ViewEventComponent,
},
{
path: 'edit',
component: EventEditorComponent,
canActivate: [AuthGuard]
}
]
},
]
},
{
path:'event/new',
component: EventEditorComponent,
canActivate: [AuthGuard]
}
]
},
];
Есть ли способ, при котором, если пользователь попытается перейти на страницу без :gymId
, он автоматически добавит это? Например, /profile
-> /gym151/profile
или, если пользователь просто перенаправляет на /
, он перейдет на /gym151
?
Комментарии:
1. таким образом, пользователь не может перейти к ‘/’? Он должен перенаправляться на ‘/:gymId/profile’? Если это так, то вы можете изменить маршрут HomeComponent, чтобы вместо этого пустой путь маршрута перенаправлял на нужный маршрут. angular.io/guide/router#set-up-redirects
2. хм, как я могу получить
:gymId
, если его больше нет в маршруте? Для этого я подписываюсь на параметры маршрута, и если они переходят на URL-адрес, который больше не указан в маршруте, это все ломает :/
Ответ №1:
Вы могли бы попробовать отключить защиту и перенаправить оттуда на соответствующий маршрут.
@Injectable({
providedIn: 'root'
})
export class RedirectGuard implements CanDeactivate<TodoComponent> {
canDeactivate(
component: TodoComponent,
currentRoute: ActivatedRouteSnapshot,
currentState: RouterStateSnapshot,
nextState?: RouterStateSnapshot) {
this.router.navigateByUrl(`/${currentRoute.params['gymId']}`);
return true;
}
constructor(
private router: Router
) { }
}
Что-то вроде этого
https://stackblitz.com/edit/angular-uttust
Комментарии:
1. Это просто очень просто, поэтому, если вы выберете что-то подобное, я уверен, что его можно изменить, чтобы лучше соответствовать вашим потребностям.
2. потребуется
this.router.navigateByUrl(
ли для /${currentRoute.params[‘gymId’]});
дополнительные маршруты к нему или этого достаточно, чтобы дополнить все маршруты этим параметром gymId?3. Это перенаправит каждый маршрут, к которому он привязан, когда вы пытаетесь перейти от этого компонента. Вероятно, вы захотите проверить маршрут, чтобы узнать, нужно ли его перенаправлять, прежде чем вызывать navigatebyurl
4. хм, я просматриваю документы Angular по canDeactivate, и я не совсем уверен, для чего
component
они нужны. С чем это связано конкретно?5. Одно из применений can деактивировать защиту — предоставить способ предотвратить навигацию из компонента, когда форма изменилась и не была сохранена. Компонент предоставляет доступ к компоненту, чтобы вы могли при необходимости проверить состояние компонента.