angular - 使用异步管道时缓存发出的值以便能够过滤掉未来的发出
问题描述
我正在尝试缓存 observable 的发射值,以过滤掉不相关的未来发射。
我有一条路线:
{ path: "user/:id/:type", component: UserComponent }
在该组件中,我得到了ActivatedRoute
参数,switchMap
到实际的 http 调用,并async
在模板上使用管道来显示用户详细信息。
user$: Observable<User>;
ngOnInit() {
this.user$ = this.route.params.pipe(
switchMap(params => {
return this.http.getUser(params.id)
})
);
}
在它自己的模板中:
<div *ngIf="user$ | async as user">
<span>{{ user.id }}</span>
<span>{{ user.name }}</span>
</div>
this.route.params
如果路线更改但:id
参数保持不变,我想过滤掉值。
我在想类似的东西
user$: Observable<User>;
ngOnInit() {
this.user$ = this.route.params.pipe(
withLatestFrom(this.user$ || Observable.from({})),
filter( ([params, user]) => {
return (params.id !== user.id); // filter if params id equals to last fetched user
}),
switchMap(params => {
return this.http.getUser(params.id)
})
);
}
但withLatestFrom
出现空值。我想避免使用水龙头操作符缓存它,而只是想出一个干净的替代方案,就像我试图走的路一样。我错过了什么?
解决方案
要仅将值与最后一次发射进行比较,您可以使用 RxJSpluck
运算符选择id
属性并使用distinctUntilChanged
运算符忽略通知,直到id
更改。
尝试以下
ngOnInit() {
this.user$ = this.route.params.pipe(
pluck('id'),
distinctUntilChanged(),
switchMap(id => {
return this.http.getUser(id)
})
);
}
或者要忽略所有重复项并仅针对不同id
的 s 触发 HTTP 请求,您可以使用 RxJSdistinct
运算符。
ngOnInit() {
this.user$ = this.route.params.pipe(
distinct(params => params['id']),
switchMap(params => {
return this.http.getUser(params.id)
})
);
}
推荐阅读
- android - 如何通过 Google Map API 获取公路距离
- html - 从 HTML、CSS 中的模板中删除滑块
- reactjs - 反应原生动画动画一次
- database - 我应该为内联字符串使用哪些索引?
- c# - 当用户通过 C# 在 Windows 登录屏幕中的登录选项之间切换时,有什么方法可以获取事件
- ios - 找到正确的方法来增加用户脚上的鞋子
- php - 在 Laravel 的命名空间之前添加 Facades,它是如何工作的?
- linux - 无法在 Linux(Ubuntu)上使用 glew.h
- graphql - GraphQL - 联合类型给出错误 no class could be found for that type name
- reactjs - Production Cookie 出现在 Development and Staging 中