2017-07-14 56 views
1

我有一个可观察的(或主题)角4组件,我在模板中使用async管道,如下所示:如何删除/销毁角度2 +模板中的观察值

<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(); 

如果这个调用返回一个可观察的命令,它就会显示在模板。如果没有,则显示#noOrder模板。

现在我的问题是:如果我将observable更改为主题,并且当前活动的订单不再存在(即,因为它已提交或关闭),是否有任何方法可以删除主题或传递某些内容主题,所以模板显示#noOrder模板,而不是显示可观察内容的模板,在它显示后者之后?

回答

1

SubjectObservable,所以它的工作原理是一样的。您只需拨打complete()即可告诉模板没有更多数据出现,因此会触发其他条件。

this.subject = new Subject(); 
if(data) { 
    this.subject.next(data); 
} 
this.subject.complete(); 

在上例中总是调用complete()。当您不试图流式传输一系列项目时,这是一种很好的做法。该示例仅在该值存在时发出值。

注意:如果当时没有用户,则调用next。没有人会收到这些数据。如果您知道在致电next后模板将会呈现,您可能需要使用ReplaySubject。它发出最后的第n个项目。

+0

感谢您的回复。但是这对我来说并不适用,即使主题是完整的,模板仍会显示通过主题最后发生的任何内容。 –

+0

@ R.Wenger你可以在第一个observable完成后使用'exhaust'操作符发出'false'值。 'Observable.of(this.subject,假).exhaust()' – cgTag