【问题标题】:Use async pipe and observable for entire block对整个块使用异步管道和可观察的
【发布时间】:2019-01-15 18:07:01
【问题描述】:

我有一个 Observable,它从 API 返回一个大对象。我需要在我的模板中显示这些值。

对于作为数组返回的其他数据,我可以使用:

<div *ngFor="let value of values | async">
  <p>{{ value.prop }}</p>
</div>

我不需要在 *ngFor 中等待异步完成,因为它在父元素中已经有了一个异步管道。

对于我的对象,我正在寻找类似的东西。目前,我正在做类似的事情:

<h2>{{ (obj | async)?.title }}</h2>
<p>{{ (obj | async)?.prop.prop2 }}</p>
<p>{{ (obj | async)?.another.prop }}</p>

这显然会留下很多重复的代码。有这样的东西吗?

<div *using="obj | async">
  <!-- obj has resolved, can access obj.prop -->
</div>

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

    使用“as”语法。

    还要注意,每个异步管道都会创建一个新订阅,如果您的订阅使用 http - 这意味着多个 http 调用。如果您想在带有异步管道的模板中多次使用相同的 observable,请使用 Rx share()。

         @Component({
          selector: 'my-app',
          template: `
            <div>
              <div *ngIf="obj$ | async as obj; else empty">
             {{obj.x}}
             {{obj.y}}
             </div>
             <ng-template #empty>Empty. Wait 5 s...</ng-template>
            </div>
          `,
        })
        export class App {
          s = new Subject();
          obj$;
          constructor() {
            this.obj$ = this.s.asObservable();
            setTimeout(() => {
              this.s.next({x:12, y:100});
            }, 5000)
          }
        }
    

    【讨论】:

    【解决方案2】:

    你可以像这样创建一个别名:

    <div *ngIf="(obj$ | async) as obj">
      <h2>{{ obj?.title }}</h2>
      <p>{{ obj?.prop.prop2 }}</p>
      <p>{{ obj?.another.prop }}</p>
    </div>
    

    【讨论】:

    • obj$ | async 周围的括号是否必要? obj后面的问号有必要吗?
    • 这两个问题的答案都是否定的。但是对于第二个问题,最好使用 $ 来区分 Observables 变量。
    • 不需要使用问号,因为obj必须有值;如果 obj 没有 *not 值,则使用 ngIf="..." 将阻止内部组件呈现......对吗?
    猜你喜欢
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2018-07-24
    • 2018-09-20
    • 2017-04-16
    • 2016-08-14
    • 2019-09-22
    相关资源
    最近更新 更多