193

我正在尝试从组件中更新(添加、删除)queryParams。在 angularJS 中,它曾经是可能的,这要归功于:

$location.search('f', 'filters[]'); // setter
$location.search()['filters[]'];    // getter

我有一个应用程序,其中包含用户可以过滤、订购等的列表,我想在 url 的 queryParams 中设置所有激活的过滤器,以便他可以复制/粘贴 url 或与其他人共享。

但是,我不希望每次选择过滤器时都重新加载我的页面。

用新路由器可以吗?

4

10 回答 10

401

您可以使用新的查询参数导航到当前路线,这不会重新加载您的页面,但会更新查询参数。

类似于(在组件中):

constructor(private router: Router) { }

public myMethodChangingQueryParams() {
  const queryParams: Params = { myParam: 'myNewValue' };

  this.router.navigate(
    [], 
    {
      relativeTo: activatedRoute,
      queryParams: queryParams, 
      queryParamsHandling: 'merge', // remove to replace all query params by provided
    });
}

请注意,虽然它不会重新加载页面,但它会将新条目推送到浏览器的历史记录中。如果您想在历史记录中替换它而不是在那里添加新值,您可以使用{ queryParams: queryParams, replaceUrl: true }.

编辑:正如评论中已经指出的那样,[]并且relativeTo在我的原始示例中缺少该属性,因此它也可能更改了路线,而不仅仅是查询参数。在这种情况下,正确的this.router.navigate用法是:

this.router.navigate(
  [], 
  {
    relativeTo: this.activatedRoute,
    queryParams: { myParam: 'myNewValue' },
    queryParamsHandling: 'merge'
  });

将新参数值设置为null将从 URL 中删除参数。

于 2017-04-30T13:35:43.393 回答
36

@Radosław Roszkowiak 的回答几乎是正确的,除了relativeTo: this.route以下要求:

constructor(
    private router: Router,
    private route: ActivatedRoute,
) {}

changeQuery() {
    this.router.navigate(['.'], { relativeTo: this.route, queryParams: { ... }});
}
于 2018-01-19T09:06:46.643 回答
21

在 Angular 5 中,您可以通过解析当前 url轻松获取和修改urlTree的副本。这将包括查询参数和片段。

  let urlTree = this.router.parseUrl(this.router.url);
  urlTree.queryParams['newParamKey'] = 'newValue';

  this.router.navigateByUrl(urlTree); 

修改查询参数的“正确方法”可能是使用 createUrlTree如下所示,它从当前创建一个新的 UrlTree,同时让我们使用NavigationExtras对其进行修改。

import { Router } from '@angular/router';

constructor(private router: Router) { }

appendAQueryParam() {

  const urlTree = this.router.createUrlTree([], {
    queryParams: { newParamKey: 'newValue' },
    queryParamsHandling: "merge",
    preserveFragment: true });

  this.router.navigateByUrl(urlTree); 
}

为了以这种方式删除查询参数,您可以将其设置为undefinednull

于 2017-11-30T19:54:23.163 回答
15

投票最多的答案部分对我有用。浏览器 url 保持不变,但routerLinkActive导航后我不再工作。

我的解决方案是使用 lotation.go:

import { Component } from "@angular/core";
import { Location } from "@angular/common";
import { HttpParams } from "@angular/common/http";

export class whateverComponent {
  constructor(private readonly location: Location, private readonly router: Router) {}

  addQueryString() {
    const params = new HttpParams();
    params.append("param1", "value1");
    params.append("param2", "value2");
    this.location.go(this.router.url.split("?")[0], params.toString());
  }
}

我使用 HttpParams 来构建查询字符串,因为我已经使用它通过 httpClient 发送信息。但你可以自己构建它。

,this._router.url.split("?")[0]是从当前 url 中删除所有以前的查询字符串。

于 2019-02-28T14:04:47.657 回答
12

尝试

this.router.navigate([], { 
  queryParams: {
    query: value
  }
});

将适用于单引号以外的相同路线导航。

于 2018-06-13T06:40:14.777 回答
10

如果您想更改查询参数而不更改路由。看下面的例子可能对你有帮助:当前路线是:/search &目标路线是(没有重新加载页面):/search?query=love

    submit(value: string) {
      this.router.navigate( ['.'],  { queryParams: { query: value } })
        .then(_ => this.search(q));
    }
    search(keyword:any) { 
    //do some activity using }

请注意:您可以使用this.router.navigate( ['search']而不是this.router.navigate( ['.']

于 2017-12-29T20:55:42.223 回答
9

我最终urlTreelocation.go

const urlTree = this.router.createUrlTree([], {
       relativeTo: this.route,
       queryParams: {
           newParam: myNewParam,
       },
       queryParamsHandling: 'merge',
    });

    this.location.go(urlTree.toString());

不确定是否toString会导致问题,但不幸location.go的是,似乎是基于字符串的。

于 2019-12-18T14:24:18.317 回答
5

更好的是 - 只是 HTML:

<a [routerLink]="[]" [queryParams]="{key: 'value'}">Your Query Params Link</a>

注意空数组,而不是仅仅做routerLink=""or[routerLink]="''"

于 2020-12-09T16:13:31.270 回答
2

Angular 的 Location 服务应该在与浏览器的 URL 交互时使用,而不是用于路由。这就是为什么我们要使用定位服务。

Angulars HttpParams用于创建查询参数。请记住 HttpParams 是不可变的,这意味着在创建值时必须将其链接起来。

最后,在this._location.replaceState不重新加载页面/路由的情况下使用更改为 URL 和原生 jslocation.path获取不带参数的 url 以每次重置参数。

constructor(
    private _location: Location,
) {}

...

updateURLWithNewParamsWithoutReloading() {
    const params = new HttpParams().appendAll({
        price: 100,
        product: 'bag'
    });

    this._location.replaceState(
        location.pathname,
        params.toString()
    );
}
于 2021-08-10T09:09:59.607 回答
1

首先,我们需要从 Angular 路由器中导入路由器模块并声明它的别名

import { Router } from '@angular/router'; ---> import
class AbcComponent implements OnInit(){
constructor(
    private router: Router ---> decalre alias name
  ) { }
}

1.您可以使用“router.navigate”函数更改查询参数并传递查询参数

this.router.navigate([], { queryParams: {_id: "abc", day: "1", name: "dfd"} 
});

它将更新当前即激活路由中的查询参数

  1. 下面将重定向到带有 _id、day 和 name 作为查询参数的 abc 页面

    this.router.navigate(['/abc'], { queryParams: {_id: "abc", day: "1", name: "dfd"} });

    它将更新“abc”路由中的查询参数以及三个查询参数

获取查询参数:-

    import { ActivatedRoute } from '@angular/router'; //import activated routed

    export class ABC implements OnInit {

    constructor(
        private route: ActivatedRoute //declare its alias name
      ) {}

    ngOnInit(){
       console.log(this.route.snapshot.queryParamMap.get('_id')); //this will fetch the query params
    }
于 2018-10-15T08:29:35.570 回答