对整个块使用异步管道和observable

时间:2017-05-03 17:19:04

标签: angular typescript

我有一个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>

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

使用&#39;作为&#39;句法。

另请注意,每个异步管道都会创建一个新订阅,如果您订阅使用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)
      }
    }