我有一个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>
答案 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)
}
}