角度-绑定可以观察到

时间:2018-10-02 16:55:49

标签: angular angular-ui-router rxjs

我的期望是,当我设置像这样的可观察对象时,任何绑定都将使用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,因此肯定有可以使用的上下文绑定。...在角度上有类似的东西吗?我没有运气找到任何东西,所以任何建议将不胜感激。

我主要是想知道

  • 我应该绑定到组件中的Observable吗?
  • 我应该使用Observable订阅来设置实例变量吗?我觉得这很奇怪...
  • 为什么| async导致可观察对象每次都触发
  • 在哪里可以找到有关此内容的合法文档?似乎有些文档包含在angular文档中,有些内容包含在rxjs文档中...针对现有的每个版本的角度都有博客文章,它们可能已经过时了(使用我找不到的方法{{1} })...是否有确定的任何角度来源(至少在可观察对象方面)?

1 个答案:

答案 0 :(得分:0)

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

有两种可能的解决方案。一种是订阅this.thing并使用模板中值的不可观察版本。这样做可以摆脱异步管道,并且需要在销毁组件时清理可观察的对象。或者,您可以将可观察对象转换为主题(对象是单播),并且仍在模板中使用异步管道。