angular - 绑定触发 observable

angular - bindings fire off observable

我的期望是,当我像这样设置一个可观察对象时,任何绑定都将使用 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 Observable 的独立订阅。

我怎样才能避免这种情况?我看到 angular 模板,我可以在其中使用 let-* 语法指定一些上下文....但我想知道是否有比指定专用于此的整个模板更直接的方法... . 上次我使用 MVVM 是 knockoutjs 所以肯定有一个上下文绑定你可以使用.... angular 中有类似的东西吗?我没有找到任何东西,所以任何建议将不胜感激。

我主要是想知道

这里发生了几件事。首先 Observables 是多播的。这意味着对于每个订阅者,switchMap 中的函数都会被调用。

有几个可能的解决方案。一种是订阅 this.thing 并在模板中使用值的不可观察版本。这样做你摆脱了你的异步管道,并且需要在组件被销毁时清理你的可观察对象。或者,您可以将 observable 变成一个 Subject(Subjects 是单播的)并且仍然在您的模板中使用异步管道。