2017-07-14 11 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テンプレートが表示されます。

私の質問は、オブザーバブルをサブジェクトに変更し、現在アクティブなオーダーがもう存在しない場合(つまり、サブミットまたはクローズされているため)、サブジェクトを削除する方法や、テンプレートは、観察可能なコンテンツを表示するのではなく、#noOrderテンプレートを表示します。

答えて

1

SubjectObservableなので、同じように動作します。 complete()に電話をかけて、それ以上のデータが来ていないことをテンプレートに伝え、それによってelse条件をトリガーするだけです。

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

上記の例では、が常に呼び出されます。あなたが一連のアイテムをストリーミングしようとしていないときは、良い習慣です。この例では、値が存在する場合にのみ値を出力します。

注:当時加入者がいない場合、nextが呼び出されます。誰もデータを受け取ることはありません。 nextに電話した後にテンプレートがレンダリングされることがわかっている場合は、代わりにReplaySubjectを使用します。最後のn番目の項目を出力します。

+0

ご返信ありがとうございます。しかし、これは私のためには機能しません、たとえ主題が完全であっても、主題を最後に通ったものはテンプレートに表示されます。 –

+0

@ R.Wenger 'exhaust'演算子を使って、最初の観測値が完了した後に' false'値を出力することができます。 'Observable.of(this.subject、false).exhaust()' – cgTag

関連する問題