我正在构建一个Angular应用程序,其中大多数路由将属于给定项目并包含projectId . 在顶部导航区域将是项目的下拉列表 . 当用户从下拉列表中选择项目时,它需要导航到当前路径,但projectId将替换为新值 .
这与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”的段然后 grab 下一个段) .
从概念上讲,我想
-
从路由器抓取路线参数的当前路线和 Map (如paramMap),查询参数和矩阵参数
-
根据需要修改这些映射中的值,即如果paramMap包含"projectId",则更新它 .
-
将路线和 Map 交回路由器进行导航 .
所以它看起来在概念上很简单,但是当我查看路由器的routerState及其路由树(我不太了解)和Router.navigate方法时,我看不到如何实现这一点 . 走路线树重新 Build 路线我没有问题,只要1)它可以一般地完成,不知道应用的路线结构,2)结果路线与原路线相同(包括查询和矩阵参数),而不是更改目标路由参数(projectId) .
1 回答
那这个呢:
我将ActivatedRoute和路由器注入我的服务/组件:
然后我做了一个改变路由矩阵参数的方法 . 参数是要替换的矩阵参数的名称和新值 . 除了将路径段与激活路径的参数进行比较之外,我发现没有其他方法可以查找要替换的参数 .
最后通过调用导航到替换的路线: