Angular:如何在不更改路由的情况下更新 queryParams

标签 angular query-string angular-router

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

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

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

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

这对新路由器可行吗?

最佳答案

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

类似的东西(在组件中):

import {ActivatedRoute, Router} from '@angular/router';
constructor(
    private router: Router,
    private activatedRoute: ActivatedRoute,
) { }

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 中删除该参数。

关于Angular:如何在不更改路由的情况下更新 queryParams,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43698032/

相关文章:

c# - 带有 Angular 6 的 .Net Framework 4.5 中的 CORS 问题

javascript - "key"和 "key="URL 查询字符串之间有区别吗?

java - 更改struts 2中的显示URL以隐藏请求参数

javascript - router.navigate 与查询参数 Angular 5

angular - 访问不是组件或 html 标签的组件标签的内部文本?

javascript - 如何在 Angular 13 系统上安装 Angular 11 时启动它

c# - 如何使用 Swashbuckle 记录查询字符串参数?

javascript - Angular 5 - 如何在某些路由上加载某些 css 样式(引导 css 仅适用于管理路由)

angular - 我如何在规范测试中模拟 ngOnInit() 中的路由 queryParams

css - 强制 Angular cli gz 生成