2017-10-10 7 views
0

httpリクエストから生成されたデータ(ユーザー)の表をAPIに表示するコンポーネントがあります。フィルタの様々な次のように私は、テーブルのデータを生成し、テーブルの上にあります。combineLatestを使用したリフレッシュリスト:Angular2 + RxJS

this.displayUsers$ = Observable.combineLatest(
      this.users$, 
      this.siteFilter$, 
      this.clientFilter$, 
      this.activeFilter$, 
      this.nameFilter$ 
     ) 
      .map(([users, siteFilter, clientFilter, activeFilter, nameFilter]) => { 
       console.log("Users changed? ", users); 
       if (siteFilter === null 
        && clientFilter === null 
        && activeFilter === null 
        && nameFilter.length < 1) { 
        return users; 
       } 
       return users 
        .filter(user => { 
         // manipulate users array based on filters 
        }) 
      }); 

xFilter$ sがテンプレートでの入力に変化に応じて新しい値を発するBehaviorSubjectsあります。次のようにusers$が割り当てられます。getList()は、httpリクエストを返す

this.users$ = this.userService.getList(); 

は、ユーザーのリストを取得します。

フィルタが変更されるとリストは正常に更新されますが、新しいユーザーでリストを更新する必要があるときに問題が発生します。例えば、ユーザは、ユーザのテーブルに対してCRUD操作を実行することができる(すなわちユーザを削除する)ことができる。ただし、ユーザーが削除されると、この変更を反映するためにテーブルは更新されません。私が現在使用している方法は、表は削除操作の成功コールバックでリフレッシュ機能を呼び出すことである新鮮に(してみてください):操作の後にこれを呼び出すにもかかわらず

refreshUserList() { 
     console.log("Refreshing user list"); 
     this.users$ = this.userService.getList(); 
    } 

combineLatest観測可能ではない、完全ですもう一度「トリガー」を取得し、リストのデータは失効したままになります。 combineLatestによって生成されたデータをHTTPリクエストでリフレッシュするより良い方法はありますか?

答えて

1

主な問題は、ユーザーリスト更新の場合、ユーザー$ observableは新しい値を放出しないということです。あなたはそうする必要があります。

は、これはそれを修正するためにどのようなアイデアのスケルトンです:

const updateUsersTrigger = new Subject<void>(); 

this.displayUsers$ = Observable.combineLatest(
    // switchMap() will re-subscribe to this.userService.getList() observable on each emit from updateUsersTrigger 
    // thus making http requests each time when user list should be updated. 
    updateUsersTrigger.startWith(null).switchMap(() => this.userService.getList()), 
    this.siteFilter$, 
    this.clientFilter$, 
    this.activeFilter$, 
    this.nameFilter$ 
) 
    .map(([users, siteFilter, clientFilter, activeFilter, nameFilter]) => { 

    ....... 

}); 

// this will trigger user list update 
updateUsersTrigger.next(); 
+0

これは多くの意味を持ちますが、提案に感謝します。しかし、今では(たとえ私がフィルタを変更しても)テーブルのデータが得られないので、私の実装で何かが欠けていると思います。私はrefreshUserList(){updateUsersTrigger.next()を変更しました。 }これをngOnInit()で呼び出すが、まだ運がない。 – natmegs

+0

@natmegs、ngOnInit()で何かを放出するのではなく、 'updateUsersTrigger.startWith(null).switchMap(()=> ... call service ...)'のようなものを試してみてください。実際、私はそれが早すぎると思う。 –

0

私はまだコメントすることはできませんよ、そう、これは外にある場合、私はここに書いて、私が間違っているなら、私を修正しますかよ質問。成功した削除で.splice()を使用して別のhttp要求を送信する代わりにDOMを更新すると、クライアントでの負荷が軽減されないでしょうか?

+0

いずれにしてもOPは新しい配列を生成するためには観測可能なものが必要ですが、httpリクエストまたはスプライス()の結果がObservable.map()やその他のものになります。 –

関連する問題