我在角度4组件中有一个可观察的(或主题),我在模板中使用async
管道,如下所示:
<div *ngIf="(orderObservable | async) as order; else noOrder ">
The active order was created at {{ order.created_at }}
</div>
<ng-template #noOrder>
There is no active order at the moment. Sorry.
</ng-template>
只要订单不存在,或者通过HTTP调用检索,它就像魅力一样。在代码中,这看起来像这样:
this.orderObservable = OrderService.getActive();
如果此调用返回带有订单的observable,它将显示在模板中。如果没有,则显示#noOrder模板。
现在我的问题是:如果我将observable更改为主题,并且当前活动的订单不再存在(即因为它已提交或关闭),是否有任何方法可以删除主题,或者将某些内容传递给主题subject,所以模板显示#noOrder模板而不是显示可观察内容的模板后显示后者?
答案 0 :(得分:1)
Subject
是Observable
所以它的工作方式相同。您只需要调用complete()
告诉模板不再有数据,因此会触发其他条件。
this.subject = new Subject();
if(data) {
this.subject.next(data);
}
this.subject.complete();
在上面的示例中,始终会调用complete()
。当您不尝试流式传输一系列项目时,这是一种很好的做法。该示例仅在值存在时才会发出值。
注意:如果在调用
next
时没有订阅者。没人会收到数据。如果您知道在致电next
后该模板会呈现,则可能需要使用ReplaySubject
。它排出了最后的第n项。