Angular路由守卫里怎么获取路由参数?

シ艳君 阅读 2

我在用 Angular 的 CanActivate 守卫做权限校验,但需要根据 URL 里的 id 参数来判断用户是否有权限,可是在守卫里拿不到 ActivatedRoute 的 paramMap,试了注入 ActivatedRoute 也不行,总是空的。

网上有人说要用 Router.getCurrentNavigation(),但我试了返回的是 null,是不是因为守卫执行时导航还没完成?有没有靠谱的办法能拿到这个参数啊?

canActivate(
  route: ActivatedRouteSnapshot,
  state: RouterStateSnapshot
): boolean {
  // 这里想拿到 /user/123 中的 123
  const id = route.paramMap.get('id'); // 但这里 id 是 null!
  return this.checkPermission(id);
}
我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
a'ゞ云娴
路由守卫里拿参数确实是个坑,我之前也踩过。关键点在于要用 route.params 而不是 paramMap,而且要看参数是在路径里还是查询参数。

两种常见情况:

1. 如果是路径参数(比如 /user/:id):
canActivate(route: ActivatedRouteSnapshot): boolean {
const id = route.params['id']; // 注意这里是 params 不是 paramMap
return this.checkPermission(id);
}


2. 如果是查询参数(比如 /user?id=123):
canActivate(route: ActivatedRouteSnapshot): boolean {
const id = route.queryParams['id'];
return this.checkPermission(id);
}


另外注意路由配置要写对,比如路径参数要这样配:
{ path: 'user/:id', component: UserComponent }


别用 getCurrentNavigation() 这种骚操作,直接改上面那样就行。我当初也折腾半天才发现是 basic 问题,md...
点赞
2026-03-07 19:10