私は、オブザーバブルオブジェクトのプロパティを更新する必要があります。私はそれを動作させることができたが、私はそれをどうやって行ったのか本当に好きではない。Observable/BehaviorSubjectをコードから更新するには?
next(filter$: BehaviorSubject<GridCollectionFilter>, collection: GridCollectionModel<any>) {
let filter = filter$.value;
if (!filter.page) {
filter.page = 1;
}
filter.page++;
if (filter.page > collection.pageCount) {
filter.page = collection.pageCount;
}
this.updateFilter(filter$);
}
first(filter$: BehaviorSubject<GridCollectionFilter>) {
filter$.value.page = 1;
this.updateFilter(filter$);
}
last(filter$: BehaviorSubject<GridCollectionFilter>, collection: GridCollectionModel<any>) {
filter$.value.page = collection.pageCount;
this.updateFilter(filter$);
}
updateFilter(filter$: BehaviorSubject<GridCollectionFilter>, filter?: GridCollectionFilter) {
filter$.next(_.clone(filter || filter$.value));
}
この場合にはfilter$
値オブジェクトを更新するために、よりエレガントな方法はありますか?
filter$.next(_.clone(filter$.value))
というコードを使って、観測されたオブジェクトのいくつかのプロパティを単に更新するたびに、オブザーバブルのクローンを自分自身に与えるという考えは本当に嫌です。私は参照を中断するために_.clone()
を使用しています(そうでなければ、rxjs distinctUntilChanged()
は明白な理由のために起動しません)。
私がやっていることを短縮するrxjs拡張がありますか?私は内部でfilter$.next(_.clone(filter$.value))
を行うfilter$.commitValueChanges()
の行に沿って何かを考えています。
私はobservablesにはかなり新しいので、私はこれについて完全に間違った方法で最初に考えているのかどうかはわかりません。私は、変更リスナーをトリガーしたいときに、私が新しい状態をコミットするはずであることを理解しています。フィルタ$ .valueを直接変更する必要があるかどうかはわかりません。または、filter
(フィルタ)とfilter$
(フィルタの観測可能)の2つのオブジェクトを持つことを想定していますが、filter
の変更が発生するたびにfilter
〜.next()
を提出するだけで、絶対にfilter$
を突然変更することはありませんか?しかし、これでは2つのオブジェクトがあります.1つは、アプリケーションを変更していて、さまざまなイベントハンドラを取り付けることによって手動で処理しなければならないオブジェクトと、もう1つを更新できるオブジェクトです。filter$
です。それは私にとっては過度でハッキリなようです。
Thnx。
私は 'distinctUntilKeyChanged()'ビットが好きです。これはとても役に立ちます。私はそれを認識していませんでした。しかし、追加の複雑さを加えてコードを重複させてしまうので、追加のcurrentFilterフィールドを追加することは私にはあまりありません。私は2つのフィルタオブジェクトを持つことを避けようとしており、1つのトリックを行うことができるはずの意見です。彼らのうちの2人がハッキーと乱雑に感じる。 – pootzko
貼り付けられたメソッドは実際にはコンポーネントではなくサービスクラスにあります。 'filter $' observableはカスタム 'BaseGridComponent'で作成されたもので、次にイベントハンドラメソッド(次に貼り付けられなかった最後のものや他のもの)は' filter $ 'を更新するはずです理にかなっている。 'filter $ .value'は監視されるもので、変更されると、フィルタオブジェクトはバックエンドに送られてデータを取得します。 – pootzko
それをコンポーネントBaseGridComponentに移動します。 BaseGridComponentによって拡張されたグリッドでは、フィルタの変更を待機し、残りのコレクションをリロードするための残りのAPIを呼び出します。あなたが思うこと ? – pioro90