我正在构建一个 Angular 应用程序,其中大多数路由都属于给定项目并包含一个projectId。顶部导航区域将有一个项目的下拉列表。当用户从下拉列表中选择一个项目时,它需要导航到当前路线,但将 projectId 替换为新值。
这非常类似于Angular 通过替换现有参数导航到 url https://stackoverflow.com/questions/44930868/angular-navigate-to-url-by-replacing-an-existing-parameter,但是他们接受的答案使用了查询参数;这需要对所需的路线参数起作用。此外,projectId 可能出现在路由中的不同位置,因此通常需要能够按名称交换路由参数。
所以假设我可能有以下路线:
project/:projectId/details
dashboard/status/:projectId/:year/:month/:day
admin/projects/:projectId
admin/contacts/:projectId/settings
admin/generalSettings
这些路线是虚构的,但表明projectId可能出现在不同的位置,并且前面不会有任何特定的单词(因此我不能例如查找名为“project”的段然后抓取下一个段)。
从概念上讲,我想
- 从路由器获取当前路由以及路由参数(如 paramMap)、查询参数和矩阵参数的映射
- 根据需要修改这些映射中的值,即如果 paramMap 包含“projectId”,则更新它。
- 将路线和地图交还给路由器以进行导航。
所以它在概念上看起来很简单,但是当我查看 Router 的 routerState 及其路由树(我不太理解)和 Router.navigate 方法时,我不知道如何实现这一点。我对遍历路线树来重新构建路线没有问题,只要 1) 可以在不了解应用程序的路线结构的情况下一般完成,2) 生成的路线与原始路线相同(包括查询和矩阵参数),但目标路由参数(projectId)的更改除外。
那这个呢:
我已将 ActivatedRoute 和 Router 注入到我的服务/组件中:
constructor(
private route: ActivatedRoute,
private router: Router) {}
然后我做了一个改变路由矩阵参数的方法。参数是要替换的矩阵参数的名称和新值。除了将路径段与激活路线的参数进行比较之外,我发现没有其他方法可以查找要替换的参数。
changeParam(replaceParamName: string, val: any) {
let replacePathParamIndex;
let replacePathParamValue;
this.route.params
.map((params) => replacePathParamValue = params[replaceParamName])
.mergeMap(() => this.route.url)
.map((urlSegment) =>
urlSegment.map((segment, ndx) => {
if (segment.path === replacePathParamValue) {
replacePathParamIndex = ndx;
}
return segment.path;
})
)
.subscribe((pathparts: any[]) => {
pathparts[replacePathParamIndex] = val;
this.router.navigate(pathparts);
});
}
最后通过调用导航到替换的路线:
changeParam('projectId','newprojectid');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)