angular - 在 Angular/rxjs 中使用异步管道时如何传递参数?
问题描述
我正在尝试在 Angular 中使用声明性方法,用async
管道解开可观察对象并使用OnPush
更改检测。
我有第二个 observable,它可能会或可能不会被调用,并且需要来自第一个 observable 的数据才能完成。
order.component.html
<div *ngIf="order$ | async as order">
<h3> Order {{ order.id }} </h3>
....
<app-returns *ngIf="order.status === 'Returned'"
[rma]="rma$ | async" >
</app-returns>
</div>
order.component.ts
order$: Observable<Order> = this.route.paramMap.pipe(
map((params: ParmaMap) => +params.get('id')),
switchMap((id: number) =>
this.orderSvc.get(id)
));
rma$: Observable<Rma> = this.order$.pipe(
switchMap((order: Order) =>
this.rmaSvc.get(order.rma.id)
));
这种方法的问题是 Order 服务对 API 进行了两次调用来完成此操作。
当我在模板中需要多个 observable 时,我通常会使用forkJoin
orcombineLatest
来组合它们。但在这种情况下,我只想在必要时调用 rma 服务。
其他更天真的方法(虽然很好地说明了这个问题)会产生有趣的结果。你能说429吗?
<app-returns *ngIf="order.status === 'Returned'"
[rma]="rma$(order.rma.id) | async" >
</app-returns>
打字稿
rma$(id: number): Observable<Rma> {
return this.rmaSvc.get(id);
}
使用异步管道时如何传递参数?
解决方案
您可以使用用于缓存的shareReplay将您的订单可观察更改为:
order$: Observable<Order> = this.route.paramMap.pipe(
map((params: ParmaMap) => +params.get('id')),
switchMap((id: number) =>
this.orderSvc.get(id)
),
shareReplay(1)
);
然后使用 switchMap 创建您的 rma observable
rma$: Observable<Rma> = order$.pipe(
switchMap((order: Order) =>
this.rmaSvc.get(order.rma.id)
)
推荐阅读
- python - Tensor("conv2d_1/kernel:0", shape=(9, 9, 1, 64), dtype=float32_ref) 必须与 Tensor("input_1:0", shape=(?, 352, 288, 1)
- c - 在哪里声明结构
- mysql - 如何从一个用户的表中复制数据并使用 mysql 将其插入同一数据库中的另一个用户?
- ios - iOS如何支持IAP订阅免费试用?
- php - 在子类中调用父构造函数时出错
- pycharm - 在 PyCharm 中为 Markdown 和 reStructuredText 设置标尺和硬换行
- javascript - 如果 HTML.DropDownListFor 更改,则更改按钮颜色
- ffmpeg - 如何在 VLC 中通过 RTP 显示来自 ffmpeg 的视频(无音频)?
- php - 让图像出现在回声中