2017-07-14 81 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