角度路由器:如何替换param?

fed*_*lov 17 angular-routing angular2-routing angular

让我们假设我有3个网址: /:projectId/info, /:projectId/users, /:projectId/users/:userId/profile.所有这些都有参数projectId.UI有一个组件可以从一个项目切换到另一个项目.所以我需要:

  1. 获取当前网址
  2. 按名称更改参数(例如projectId)
  3. 导航到新网址

所以我需要一些类似的this.router.replaceParam(currentUrl, {projectId: 'project_id_2'})内容将转换/project_id_1/users/user_id_1/profile/project_id_2/users/user_id_1/profile(以及任何其他带有:projectIdparam的URL )

我认为这是一个简单而常见的问题,但在1小时内没有找到解决方案.此处建议的解决方案不起作用,如上一条评论中所述

khu*_*ush 9

要从当前网址导航到特定链接,您可以执行以下操作,

 constructor(private route: ActivatedRoute, private router: Router){}
 ngOnInit() {
     this.route.params.subscribe(params => {
         // PARAMS CHANGED ..    

         let id = params['projectid'];    
     });
 }
 navigate(){
     this.router.navigateByUrl(this.router.url.replace(id, newProjectId));
     // replace parameter of navigateByUrl function to your required url
 }
Run Code Online (Sandbox Code Playgroud)

在ngOnInit函数上,我们已经订阅了params,因此我们可以观察和执行url参数上的任何更改的语句。

  • 这是最接近的解决方案,但我无法接受,因为它需要URL中的唯一ID (4认同)
  • 如果你的规则是'location/:id/business/:id'并且两个id都是1,而我只想更改第二个,你的解决方案如何工作? (2认同)
  • 这是在做string.replace吗?...如果你的 url 是“/account/123/project/123”,这不会把事情搞砸吗?这只是假设 id 在整个 url 字符串中是唯一的。 (2认同)
  • -1 即使参数名称不同,也是错误的。例如:如果路由参数是 `/:projectId/users/:userId` 并且项目的 id 恰好与用户的 id 相同,它将替换两者,这是不希望的。 (2认同)

Ger*_*rbó 7

您可以使用:

this.router.navigate(
      [],
      {
        relativeTo: this.activatedRoute,
        queryParams: {projectId: 'project_id_2'},
        queryParamsHandling: "merge", // remove to replace all query params by provided
      });
Run Code Online (Sandbox Code Playgroud)

  • 这将是最优雅的解决方案。不幸的是,它仅在数据通过 queryParams 传递时才有效。 (9认同)

Omk*_*hav 5

您可以使用 HTML 或 Ts

1 > 在 HTML 中

[routerLink]="['../info']"
        Or
[routerLink]="['../users']"
    like this etc....
Run Code Online (Sandbox Code Playgroud)

2 > 在打字稿中

this.router.navigate(['../users'], { relativeTo: this.activatedRoute });
Run Code Online (Sandbox Code Playgroud)


Cru*_*ine 1

看看你的问题,你想改变2个参数。

如中所述:

https://angular.io/api/router/Router#navigatebyurl

你可以实施router.navigate([yourprojectId, 'users', youruserId , 'profile'], {relativeTo: route});

  • 我不知道什么是当前页面(`/:projectId/info`、`/:projectId/users` 或任何其他页面)/我不知道当前页面的 URL 结构(它可能有任何其他附加信息)帕拉姆)。我只知道它有参数`:projectId`,我想将`:projectId`从`A`替换为`B` (16认同)