【问题标题】:Generically replace Angular 2 route parameter and navigate一般替换 Angular 2 路由参数并导航
【发布时间】:2017-07-12 21:39:47
【问题描述】:

我正在构建一个 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”的段然后抓取下一个段)。

从概念上讲,我想

  • 从路由器中获取当前路由和路由参数(如 paramMap)、查询参数和矩阵参数的映射
  • 根据需要修改这些映射中的值,即如果 paramMap 包含“projectId”,则更新它。
  • 将路线和地图交还给路由器,以便在那里导航。

所以它在概念上看起来很简单,但是当我查看路由器的 routerState 及其路由树(我不太明白)和 Router.navigate 方法时,我不知道如何实现这一点。我在遍历路线树以重新构建路线时没有问题,只要 1)它可以在不了解应用程序的路线结构的情况下一般地完成,并且 2)生成的路线与原始路线相同(包括查询和矩阵参数),而不是对目标路由参数(projectId)的更改。

【问题讨论】:

    标签: angular angular-routing


    【解决方案1】:

    这个呢:

    我将 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');
    

    【讨论】:

    • 如果 url 中有 2 个相同的参数值,这将无法正常工作 - 即路由是“project/projectId:/item/itemId:/details”并且当前路径是“project/75/item/75/详细信息”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多