我的期望是,当我设置像这样的可观察对象时,任何绑定都将使用switchMap
调用的结果:
this.thing = this.route.paramMap.pipe(
switchMap(async (params: ParamMap) => {
const id = +params.get('id');
const data = await this.thingService.getThingDetails(id);
return new ThingDisplay(data);
})
)
但是,如果我有多个{{ (thing | async)?.prop }}
形式的绑定,我会发现每个绑定的服务方法都称为 。
这意味着每次| async
的使用都会创建对this.thing
可观察的独立订阅。
如何避免这种情况?我看到的是角度模板,可以在其中使用let-*
语法指定一些上下文。...但是我想知道是否有比指定一个专用于此的整个模板更直接的方法。我用的是MVVM,它是基因敲除js,因此肯定有可以使用的上下文绑定。...在角度上有类似的东西吗?我没有运气找到任何东西,所以任何建议将不胜感激。
我主要是想知道
| async
导致可观察对象每次都触发?答案 0 :(得分:0)
这里发生了几件事。首先可观察到的是多播。这意味着对于每个订阅者,switchMap中的函数都会被调用。
有两种可能的解决方案。一种是订阅this.thing
并使用模板中值的不可观察版本。这样做可以摆脱异步管道,并且需要在销毁组件时清理可观察的对象。或者,您可以将可观察对象转换为主题(对象是单播),并且仍在模板中使用异步管道。