如何将枚举定义为路由参数
How to define enums as route parameters
我正在尝试设置我的路由器,以便它使用 ../RouteSegment1/RouteSegment2/..
的路由。
enum RouteSegment1 {
value1,
value2
}
enum RouteSegment2 {
value1,
value2
}
一个可行的解决方案是像这样明确定义每条路线
const routes: Routes = [
{
path: '', component: ParentComponent, children: [
{
path: RouteSegment1.value1,
component: RouteSegment1Component,
},
{
path: RouteSegment1.value2,
component: RouteSegment1Component,
},
{
path: RouteSegment1.value1/RouteSegment2.value1,
component: RouteSegment2Component,
},
{
path: RouteSegment1.value1/RouteSegment2.value2,
component: RouteSegment2Component,
},
{
path: RouteSegment1.value2/RouteSegment2.value1,
component: RouteSegment2Component,
},
{
path: RouteSegment1.value2/RouteSegment2.value2,
component: RouteSegment2Component,
},
]
},
];
如您所见,这绝对不是一个好的解决方案,而且以后会变得更糟。
我的最终目标是像这样设置我的路线:
const routes: Routes = [
{
path: '', component: ParentComponent, children: [
{
path: RouteSegment1,
component: RouteSegment1Component,
},
{
path: RouteSegment1/RouteSegment2,
component: RouteSegment2Component,
},
]
},
];
因此,不是枚举值的路由不会路由到 RouteSegmentComponents,我会有一个可扩展的解决方案。
也许有一种方法可以通过将可能的值限制为枚举来使用 route parameters。不幸的是,我无法想出一个可行的解决方案。我尝试在这些段上使用守卫来检查参数是否是枚举的有效值。也许我只是在实施这些错误。
这是正确的方法吗?我如何配置我的路由以使用给定的 SegmentEnums 进行扩展?
不清楚你要达到什么目的。
至少,你的代码
{
path: RouteSegment1.value1/RouteSegment2.value1,
component: RouteSegment2Component,
},
应该写成
{
path: RouteSegment1.value1,
component: RouteSegment1Component,
children: [
{
path: RouteSegment2.value1,
component: RouteSegment2Component
}
]
}
所以我对我的第一种方法进行了第二次尝试,我设法让它工作了。
我定义了我的 SegmentEnums
enum RouteSegment1 {
value1,
value2
}
enum RouteSegment2 {
value1,
value2
}
创建了守卫
export class EnumRouteGuard implements CanActivate {
constructor(private router: Router) { }
public canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
const segment1: string = next.paramMap.get('routeSegment1')!;
const segment2: string = next.paramMap.get('routeSegment2')!;
const segment1IsEnum = Object.keys(RouteSegment1).find(key => RouteSegment1[key] === segment1);
const segment2IsEnum = Object.keys(RouteSegment2).find(key => RouteSegment2[key] === segment2);
if (!(segment1IsEnum && segment2IsEnum) ) {
this.router.navigate([someOtherRoute]);
return false;
}
return true;
}
}
并在我的路线中使用它们
const routes: Routes = [
{
path: '', component: ParentComponent, children: [
{
path: ':routeSegment1',
component: RouteSegment1Component,
canActivate: [EnumRouteGuard],
},
{
path: ':routeSegment1/:routeSegment2',
component: RouteSegment2Component,
canActivate: [EnumRouteGuard],
},
],
},
];
我正在尝试设置我的路由器,以便它使用 ../RouteSegment1/RouteSegment2/..
的路由。
enum RouteSegment1 {
value1,
value2
}
enum RouteSegment2 {
value1,
value2
}
一个可行的解决方案是像这样明确定义每条路线
const routes: Routes = [
{
path: '', component: ParentComponent, children: [
{
path: RouteSegment1.value1,
component: RouteSegment1Component,
},
{
path: RouteSegment1.value2,
component: RouteSegment1Component,
},
{
path: RouteSegment1.value1/RouteSegment2.value1,
component: RouteSegment2Component,
},
{
path: RouteSegment1.value1/RouteSegment2.value2,
component: RouteSegment2Component,
},
{
path: RouteSegment1.value2/RouteSegment2.value1,
component: RouteSegment2Component,
},
{
path: RouteSegment1.value2/RouteSegment2.value2,
component: RouteSegment2Component,
},
]
},
];
如您所见,这绝对不是一个好的解决方案,而且以后会变得更糟。
我的最终目标是像这样设置我的路线:
const routes: Routes = [
{
path: '', component: ParentComponent, children: [
{
path: RouteSegment1,
component: RouteSegment1Component,
},
{
path: RouteSegment1/RouteSegment2,
component: RouteSegment2Component,
},
]
},
];
因此,不是枚举值的路由不会路由到 RouteSegmentComponents,我会有一个可扩展的解决方案。
也许有一种方法可以通过将可能的值限制为枚举来使用 route parameters。不幸的是,我无法想出一个可行的解决方案。我尝试在这些段上使用守卫来检查参数是否是枚举的有效值。也许我只是在实施这些错误。
这是正确的方法吗?我如何配置我的路由以使用给定的 SegmentEnums 进行扩展?
不清楚你要达到什么目的。
至少,你的代码
{
path: RouteSegment1.value1/RouteSegment2.value1,
component: RouteSegment2Component,
},
应该写成
{
path: RouteSegment1.value1,
component: RouteSegment1Component,
children: [
{
path: RouteSegment2.value1,
component: RouteSegment2Component
}
]
}
所以我对我的第一种方法进行了第二次尝试,我设法让它工作了。
我定义了我的 SegmentEnums
enum RouteSegment1 {
value1,
value2
}
enum RouteSegment2 {
value1,
value2
}
创建了守卫
export class EnumRouteGuard implements CanActivate {
constructor(private router: Router) { }
public canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
const segment1: string = next.paramMap.get('routeSegment1')!;
const segment2: string = next.paramMap.get('routeSegment2')!;
const segment1IsEnum = Object.keys(RouteSegment1).find(key => RouteSegment1[key] === segment1);
const segment2IsEnum = Object.keys(RouteSegment2).find(key => RouteSegment2[key] === segment2);
if (!(segment1IsEnum && segment2IsEnum) ) {
this.router.navigate([someOtherRoute]);
return false;
}
return true;
}
}
并在我的路线中使用它们
const routes: Routes = [
{
path: '', component: ParentComponent, children: [
{
path: ':routeSegment1',
component: RouteSegment1Component,
canActivate: [EnumRouteGuard],
},
{
path: ':routeSegment1/:routeSegment2',
component: RouteSegment2Component,
canActivate: [EnumRouteGuard],
},
],
},
];