angular - 如何仅在参数或查询参数的一个键值对更改时触发订阅
问题描述
我有以下情况,我只想在 url 的参数发生更改或查询参数发生showList
更改时触发订阅。查询参数的其余部分page=0&size=5&sort=name,asc
仅在重新加载或导航回相同 url 等情况下添加在添加showList
queryParam 后添加,导致订阅被触发两次。
以下方式的路线变化是我点击showList按钮
http://localhost:8080/org/acount/param1/param2?showList=true
http://localhost:8080/org/acount/param1/param2?showList=true&page=0&size=5&sort=name,asc
发生第二次导航是因为当 showList 为 true 时,调用 api 来获取帐户列表,如果 api 返回非空结果,则设置页面、大小和排序。
如果按下隐藏按钮,路线将更改为此
http://localhost:8080/org/acount/param1/param2?showList=false
当按下后退按钮时,我也需要处理像 reload + 这样的情况。
我已经实施了以下方法来处理上述情况,但我知道这不是最好的解决方案:
this.params_subscribe = combineLatest([this.activatedRoute.params, this.activatedRoute.queryParams]).pipe(
map(results => ({ param: results[0], query: results[1] }))
).subscribe(result => {
let show_list: boolean = (result.query.showList === 'true');
if ((JSON.stringify(result.param) !== JSON.stringify(this.prevParam)) || (result.query.showList !== this.prevQueryParam.showList)) {
if (!this.from_ui || result.query.showList !== 'false') {
if (result.param.teamId && result.param.breadcrumb) {
...
}
else {
this.initialize()
}
}
}
this.prevParam = result.param;
this.prevQueryParam = result.query;
});
from_ui
showList
如果通过单击设置为 false的 hideList 按钮更改了查询参数,则用于防止函数调用。
有没有更好的方法来处理这个?
解决方案
您可以将distinceUntilChanged
运算符与自定义比较器一起使用。
尝试以下
combineLatest([
this.activatedRoute.params,
this.activatedRoute.queryParams
]).pipe(
map(results => ({ param: results[0], query: results[1] })),
distinctUntilChanged((prev, curr) =>
JSON.stringify(prev.result.param) === JSON.stringify(curr.result.param) &&
prev.result.query.showList === curr.result.query.showList
)
).subscribe(
...
);
推荐阅读
- sql-server - SQL Server 在非聚集索引中包含列
- node.js - 节点异步执行
- javascript - var 值由于 ajax 调用延迟而保持为假,并且组件不会在反应中更新
- android - 应用程序启动或恢复时读取 Nfc 标签
- javascript - 如何将 JSON 嵌套字典转换为 Angular js 中的 JSON 嵌套数组?
- php - autoload.php 在那里时丢失
- sql - 为表生成唯一 ID
- regex - 用正则表达式分隔起始数字
- akka-http - 如果要对所有 CRUD 操作使用 post HTTP 方法,是否会出现任何问题
- c# - 单击按钮发送电子邮件