在 Angular 中组合路由和查询参数

2024-03-10

在 Angular 中,我必须处理以下格式的路线

/sections/{id}?filter={filter}

即我有一个路线参数(id)和查询参数(filter)。两个参数都是可选的,因此所有这些路由都是有效的并且正在被监听

/sections/{id}?filter={filter}
/sections?filter={filter}
/sections/{id}
/sections

处理路线时,我需要调用可能昂贵的服务,并提供给定的参数。我可以同时订阅params and queryParams路线,但我只想在每次 url 更改时调用该服务一次,以避免任何不必要的调用。

问题是当从/sections/1?filter=active to /sections/2两个可观察量都会触发,但我无法控制哪一个先触发。另一方面,当从/sections/1?filter=active to /sections/1,或从/sections/1?filter=active to /sections/2?filter=active,只有一个会被触发。

有没有什么明智的方法可以知道最后一次订阅何时触发,以便我可以避免发送不需要的服务器调用?


到目前为止的测试代码看起来像这样:

constructor(private activeRoute: ActivatedRoute, private dataService: dataService) {

    this.activeRoute.paramMap.subscribe((params: ParamMap) => {
        console.log("triggering route params subscription");
        this.section = params.get("id");
        this.dataService.runSlowQuery(this.section, this.filter);
    });

    this.activeRoute.queryParamMap.subscribe((queryParams: ParamMap) => {
        console.log("triggering query params subscription");
        this.filter = queryParams.get("filter");
        this.dataService.runSlowQuery(this.section, this.filter);
    });
}

1.订阅路由器事件

您可以订阅路由器events。这将使您能够访问UrlTree https://angular.io/api/router/UrlTree对象,允许更大的灵活性。

import { Router, UrlTree, NavigationEnd } from '@angular/router';

...

constructor(private router: Router) {}

...

let navigation = this.router.events
   .filter(navigation => navigation instanceof NavigationEnd)
   .map((navigation) => {
     let urlTree = this.router.parseUrl(navigation['url']);
     let queryParams = urlTree.queryParams;
     let segments = urlTree.root.children['primary'] ? urlTree.root.children['primary'].segments : null;
     return { queryParams: queryParams, segments: segments }
   });

navigation.subscribe((navigation) => { ... });

2.利用combineLatest https://www.learnrxjs.io/operators/combination/combinelatest.html

let params = this.activeRoute.paramMap;
let queryParams = this.activeRoute.queryParamMap;
let navigation = Observable
   .combineLatest(params, queryParams, (params, queryParams) => ({ params, queryParams }));

navigation.subscribe((navigation) => { ... });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Angular 中组合路由和查询参数 的相关文章

随机推荐

  • 为什么 import cntk as C 在 google colab 中不起作用

    我安装了opencv版本3 4 4 安装了cntk 导入到google collab给出了以下结果 import cntk as C usr local lib python3 6 dist packages cntk cntk py in
  • 如何在 PHP 中将字符串转换为 JSON 对象

    我从 SQL 查询得到以下结果 Coords Accuracy 65 Latitude 53 277720488429026 Longitude 9 012038778269686 Timestamp Fri Jul 05 2013 11
  • Mongoose:如果元素已存储,则不插入

    我使用 MongoDB 和 Mongoose 与 Express 来存储通过 Twitter API 检索的推文 我想避免保存重复的推文 我正在做类似的事情 TweetsModel find tweet id tweet tweet id
  • 类扩展了 React.Component 不能在 React 中使用 getInitialState

    我正在 React 中尝试 ES6 语法 并编写如下组件 export default class Loginform extends React Component getInitialState return name password
  • TFS2012离线构建服务

    我配置TFS2012团队构建 在配置过程中 构建服务显示状态正在运行 不久之后 可能是 10 秒 构建控制器和构建代理服务就会停止 但在管理构建控制器窗口中 我的 TFS2012 控制器和代理显示可用 因此 我触发了为此控制器配置的构建定义
  • 集群配置中的 Hibernate 搜索?

    我正在开发一个 Java Web 应用程序 使用 JBoss Seam 作为应用程序框架 我想利用 Hibernate Search 提供实体搜索功能 集成进展顺利 距离部署也越来越近了 生产中应用程序的设置将是 2 个 或更多 Tomca
  • iphone:NSMutableURLRequest 返回 MS Word 样式撇号的奇怪字符

    我们使用 XML NSMutableURLRequest 从我们的网站上提取内容 有时它会通过 卷曲 样式的撇号和引号 而不是 提取内容 NSMutableURLRequest 似乎讨厌这些并将它们变成奇怪的 U00e2 U0080 U00
  • 隐式转换为布尔值并与布尔值进行比较

    我正在回答这个问题 https stackoverflow com questions 21350924 explicit bool operator cannot return test initialize bool 关于用户定义的转换
  • LIBCURL 中的简单 telnet 示例 - C++

    我需要在 LIBCURL curl haxx se libcurl C 中查找简单的 TELNET 示例 我搜索了这个网站 但没有找到任何简单的例子 我只需要连接到 TELNET 进行身份验证并发送消息 Thanks 在 libcurl 中
  • 通用应用程序缺少 WriteableBitmap SaveJpeg

    我正在开发一个通用应用程序 在我的共享代码中 我尝试从网络下载图像并将图像保存到 LocalFolder 我正在使用 HttpClient 从用户给定的 url 下载图像并读取客户端响应以保存图像 我正在使用下面的代码进行保存 但无法找到
  • 带有可选逗号和点的有效数字的正则表达式

    我试图只允许使用数字和特殊字符 例如 和 允许出现在我的文本字符串中 为此我尝试了以下代码 var pattern A Za z g var nospecial lt gt g if ev ctrlKey charCode 9 charCo
  • 在 Node.js 中创建 TCP 服务器和 HTTP 服务器之间的 WebSocket

    我创建了一个TCP服务器 using Node js它监听客户端连接 我需要传输数据TCP服务器 to HTTP服务器再次在 Node js 中可能通过网络套接字 套接字 io 但是 我不知道如何创建这样的连接 以便 TCP 服务器能够通过
  • 在 D3.js (V4) 中创建分类折线图

    I m 相对地D3 js 新手 我正在可视化我的 PassengersIn 和 PassengersOut 值总线数据简单 json文件 作为参考 其中一个 JSON 对象如下所示 BusNo 1 Date 21 November 2016
  • 动态添加 Y 轴

    是否可以向 Highstock 图表添加新的 y 轴 我尝试过在选项中添加一个并重新绘制 但这似乎不起作用 HighCharts 的文档包含图表对象的 addAxis 函数 但在 HighStock 中该函数不存在 还有其他选择吗 请看一下
  • TrustZone 监控模式和 IFAR、IFSR、DFAR、DFSR

    The ARM TrustZone 监控模式 http infocenter arm com help index jsp topic com arm doc prd29 genc 009492c CACJBHJA html可以在监视模式下
  • 当前视图控制器不适用于 ios 9

    目前的视图控制器不适用于 ios 9 当我按下按钮时 它没有重定向到当前视图控制器 为什么会出现这种情况 我试过下面的代码 RegistrationViewController viewController UIStoryboard sto
  • 需要将不确定数量的整数从 stdin 读取到数组中

    所以我正在编写一个练习程序 它将整数作为标准输入的输入 将它们加载到数组中 对数组进行排序 然后输出结果 我一直在努力弄清楚 C 中的 IO 是如何工作的 这是我到目前为止所掌握的内容 如果您发现任何问题 有任何建议 请告诉我 理想情况下
  • 使用 TouchHelperCallback 部分和完全滑动 Recyclerview

    我正在尝试使用 api TouchHelperCallback 实现 Recyclerview 的部分和完全滑动 遇到了几个库 例如https github com daimajia AndroidSwipeLayout https git
  • C# 如何用直引号替换微软的智能引号?

    我下面的帖子询问了大引号是什么以及为什么我的应用程序无法使用它们 我现在的问题是当我的程序遇到它们时如何替换它们 我如何在 C 中执行此操作 他们是特殊人物吗 弯引号与方引号的区别 https stackoverflow com quest
  • 在 Angular 中组合路由和查询参数

    在 Angular 中 我必须处理以下格式的路线 sections id filter filter 即我有一个路线参数 id 和查询参数 filter 两个参数都是可选的 因此所有这些路由都是有效的并且正在被监听 sections id