2017-08-02 8 views
0

Observable.mergeでどのような観測値が変更されたかを調べる方法は?あなたは、私は読みやすさと明確にするために簡略化している私のコードを見ることができます下

connect(): Observable<Customer[]> { 
    const displayDataChanges = [ 
    this._customerDatabase.dataChange, 
    this._filterChange, 
    this._sort.mdSortChange, 
    this._paginator.page 
    ]; 
    return Observable.merge(...displayDataChanges).map(() => { 
    let data = this._customerDatabase.data.slice(); 
    data = this.getFilteredData(data); 
    data = this.getSortedData(data); 
    const startIndex = this._paginator.pageIndex * this._paginator.pageSize; 
    return data.splice(startIndex, this._paginator.pageSize); 
    }); 
} 

この方法では、お客様の観測配列を返します。

は、一部は以下の観測の配列を定義します。

const displayDataChanges = [ 
     this._customerDatabase.dataChange, 
     this._filterChange, 
     this._sort.mdSortChange, 
     this._paginator.page 
]; 

私は顧客の私の配列が変わることを期待し、これらのうちの1つがデータを発するたびに。 (データをロードするとき、フィルタが変更されたとき、別のソートメカニズムを選択してページを変更したとき)

次に、これらのすべてを一緒にマージして、戻ってきた。ご覧のように、実際の観測データがデータをどのように放出したかを区別しないため、それほどパフォーマンスは良くありません。

どのように観測値を変更しましたか? (以下擬似コード)

return Observable.merge(...displayDataChanges).map(() => { 

**[ALWAYS]** 
let data = this._customerDatabase.data.slice(); 

**[IF MY SORTING HAS CHANGED]** 
data = this.getSortedData(data); /* After which i will change the dataSet */ 
**[IF MY FILTER HAS CHANGED]** 
data = this.getFilteredData(data); 

**[ALWAYS]** 
const startIndex = this._paginator.pageIndex * this._paginator.pageSize; 
return data.splice(startIndex, this._paginator.pageSize); 
}); 

答えて

0

あなたはcombineLatest代わりのmergeを使用することができます。そうすることで、結合された各オブザーバの放出値を取得することができます。最後の値であるmdSortChange_filterChangeの参照を変更したかどうかを確認するだけです。

CombineLatest documentation

connect(): Observable<Customer[]> { 
    const displayDataChanges = [ 
    this._customerDatabase.dataChange, 
    this._filterChange, 
    this._sort.mdSortChange, 
    this._paginator.page 
    ]; 

    let lastFilter = null; 
    let lastSort= null; 

    return Observable 
    .combineLatest(...displayDataChanges) 
    .map(([newData, newFilter, newSort, newPage]) => { 
     let data = this._customerDatabase.data.slice(); 

     if (newFilter !== lastFilter) { 
     data = this.getFilteredData(data); 
     lastFilter = newFilter ; 
     } 

     if (newSort !== lastSort) { 
     data = this.getSortedData(data); 
     lastSort = newSort; 
     } 

     const startIndex = this._paginator.pageIndex * this._paginator.pageSize; 
     return data.splice(startIndex, this._paginator.pageSize); 
}); 
} 
+0

こんにちはギヨーム、答えてくれてありがとう!私はそれを試みましたが、Observableの中でコードを実行しているようには見えませんか? –

+0

それはマージしますが、それは私の問題でした;) –

+0

それぞれの 'displayDataChanges'は少なくとも1つの値を出すべきです。あなたはページ、フィルタ、ソートを変更してこれが機能しているかどうか確認できますか? –

関連する問題

 関連する問題