Angular でボタンクリックなど、任意のユーザー操作のタイミングで Observable にデータを取得し、UI に最新情報を表示したいことがあります。こんな時には、Subject と switchMap オペレーターを組み合わせて使うと簡潔に実装することができます。
HTML テンプレートの実装
HTML テンプレートでは、Observable を async パイプでバインドしておきます。
<button (click)="onGetData()">データ取得</button> <button (click)="onClearList()">クリア</button> <!-- Observable をバインドするリスト --> <div *ngFor="let product of products$ | async"> <div class="product">{{ product.name }}</div> </div>
コンポーネントの実装
コンポーネントでは、ユーザー操作が発生したタイミングで Subject の next メソッドを呼び出して、データストリームの最新の状態を Observable に設定し直します。
clickStream = new Subject(); products$: Observable<any>; ... 省略 ... ngOnInit() { // products$ はデータを受け取る Observable this.products$ = this.clickStream.pipe( switchMap(() => this.http.get('/api/products/')) ); } onGetData() { // 最新のデータを取得 this.clickStream.next(); }