我有一个服务,有一些异步的东西要做,如何推迟数据绑定渲染,直到服务完成其异步工作?
<div *ngIf="screenSize < 1024">mobile element</div>
服务:
this.sessionService.onSessionChange().subscribe(function(session) {
console.log(session);
self.user = session.user;
});
用户未定义,因为会话尚未就绪:
onSessionChange(): Observable<Session> {
return this.sessionObservable.asObservable();
}
如何使用带有onSessionChange observable的管道?
答案 0 :(得分:3)
在Angular4中,一个常见的习惯用法是使用新的as
关键字,如下所示:
<ng-container *ngIf="session$ | async as session">
<!-- ^^^^^^^^^^ "as" keyword -->
<h4>Hi {{session.user.name}}</h4>
</ng-container>
如果您要在模板中的多个位置使用session
,这会更有用。
<ng-container>
可以在不向DOM添加更多节点的情况下挂起*ngIf
或*ngFor
。
答案 1 :(得分:1)
正如@Sajeetharan回答的那样,您可以使用safe navigation operator
来避免从模板中抛出未定义的错误。
正如您在问题标题中所述,您可以使用Async Pipe
自动订阅/取消订阅Observable。
Step1:在组件中公开Observable:
// expose Observable in order to access at template
user$: any;
constructor(private sessionService: SessionService) {
this.user$ = this.sessionService.onSessionChange();
}
第2步:在模板中使用Async Pipe
订阅已创建的Observable
<h4>Hi {{(user$ | async)?.user.name}}.</h4>
正在使用 DEMO
答案 2 :(得分:0)
你也可以使用 safe navigation operator
,
<h4>Hi {{user?.name}}.</h4>
答案 3 :(得分:0)
使用pluck
运算符获得异步属性:
在组件:
this.userName$ = this.sessionService.onSessionChange().pluck('user', 'name')
在模板上:
<h4>{{ userName$ | async }}</h4>