角度访问嵌套模块中的父参数



我正试图将Angular 12项目划分为(lazylod(模块,但在访问其中一个子路由中的路由参数时遇到了问题。我有以下(简化的(模块结构:

app.module
| settings.module
| core.module

对于应用程序模块,我有以下路径:

{ path: 'portfolio/:portfolio', component: PortfolioComponent, canActivate: [AccessGuard],
children: [
{ path: 'settings', component: PortfolioSettings, canActivate: [PortfolioAccessGuard],
children: [
{ path: 'product-settings', loadChildren: () => import('./product-settings/product-settings.module').then((m) => m.ProductSettingsModule) },
]}
]}

以及产品设置模块的以下路径:

{ path: '', component: ProductSettingsComponent, canActivate: [PortfolioAccessGuard] },
{ path: ':product', component: ProductSettingsComponent, canActivate: [PortfolioAccessGuard], children [...] }

例如,您可以获得以下路线:

  • /公文包/somePortfolioId/settings
  • /portfolio/somePortfolioId/settings/product settings
  • /公文包/somePortfolioId/settings/product-settings/someProductId

门禁位于核心模块中。

正如你所看到的,要访问上述路由,需要通过PortfolioAccessGuard。在这个PortfolioAccess Guard中,我想对:portfolio参数进行检查。当我访问第一条路线时,这是有效的,代码如下:

route.parent.parent.params.portfolio(路由是ActivatedRouteSnapshot(

然而,当我从子路径(通过产品设置(访问它时,我似乎找不到这个参数。我尝试了几种角度ActivatedRoute、ActivatedRouteSnapshot和Router的方法,但都没有找到有效的方法。我尝试过的一些例子:

  • this.activatedRoute.queryParams.subscribe(values => console.log(values)),其中activatedRoute的类型为activatedRoute给定{}
  • 打印ActivatedRouteSnapshot类型的this.activatedRouteSnapshot会显示数据、参数、queryParams和url为空,父级甚至不存在
  • 打印类型为Router的this.router显示其属性browserUrlTree包含有关我要查找的参数的一些信息,但我不知道如何访问它

所以我的问题是:找到这个的最佳方法是什么:访问最后两条提到的路线的投资组合参数?

使用this.activatedRoute.queryParams.subscribe(values => console.log(values))时,访问的是QueryParams,而不是Params。

尽量不要获取路由的父级-所有参数和查询参数必须在当前路由快照中可用。

Don't Use:
route.parent.parent.params.portfolio;
Try Use:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const id = route.params['portfolio'];
console.log(id);
}

您正在尝试访问queryParams,该查询参数没有在路由中定义,如上所述。

您可以通过以下方式解决:

constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.route.paramMap.subscribe(paramsMap => {
const portfolio = paramsMap.params['portfolio'];
});
}

这可能会有所帮助。

感谢

最新更新