您可以使用CanActivate / CanActivateChild / CanLoad 守卫或它们的任意组合来扩展您的路线(这完全取决于您的用例)。
{
path: ":searchType",
canActivate: ['enumerableParamsOnly'],
canLoad: ['enumerableParamsOnly'],
loadChildren: 'app/website/search.module#SearchModule'
},
并在提供者中实现所需的行为:
providers: [
{
provide: 'enumerableParamsOnly',
useValue: (route: ActivatedRouteSnapshot) => ['a', 'b', 'c'].includes(route.params['searchType'])
}
]
(当然,您也可以创建一个“普通”守卫作为服务)。
然后,如果您还想在有人仍然访问可枚举值范围之外的页面时显示某个页面,您可以添加一个简单的重定向。在这种情况下,您需要实现一个真正的守卫,因为您需要注入路由器:
{
path: ":searchType",
canActivate: [EnumerableParamsOnlyGuard],
canLoad: [EnumerableParamsOnlyGuard],
loadChildren: 'app/website/search.module#SearchModule'
},
和守卫:
class EnumerableParamsOnlyGuard implements CanActivate, CanLoad {
constructor(private router: Router) {}
canActivate(route: ActivatedRouteSnapshot) {
return this.canLoad(route);
}
canLoad(route: ActivatedRouteSnapshot) {
this.router.navigateByUrl('/not-enumerable-param');
return ['a', 'b', 'c'].includes(route.params['searchType']);
}
}