2017-04-13 2 views
0

基本的には配列のビューを制限するトグルスタイルのボタン/リンク用の素敵なRxJSパターンを見つけようとしています。2つの値の間のトグルを初期化するためのRxJSパターン

2つの値を切り替えます.1つは静的で、もう1つはObservableから来ます(実際にはHTTP要求の結果はthis.itemsArray$です)。

TS

this.toggleClicks$ = Observable.fromEvent(this.viewAllToggle.nativeElement, 'click') 
     .scan(prev => !prev, false); 

this.itemsArray$ = Observable.of([ /* array of any */ ]); 

this.viewLimit$ = this.itemsArray$ 
     .withLatestFrom(this.toggleClicks$, (items, viewAll) => { 
     return viewAll 
      ? { nowLimit: items.length, otherLimit: 5 } 
      : { nowLimit: 5, otherLimit: items.length }; 
     }) 
     .share(); 

HTML

Showing <span>{{(viewLimit$ | async)?.nowLimit}}</span>. 
<span #viewAllToggle>Show {{(viewLimit$ | async)?.otherLimit}}</span> 

それは基本的に動作しますが、明らかな問題は、最初のクリックまで取り込まれていない初期値、です。追加しても.startWith()

this.itemsArray$ = Observable.of([ /* array of any */ ]); 

それは役に立ちません。

私には何が欠けていますか?

+0

あなたは 'this.itemsArray $'と 'this.itemsArray'(' $ 'なし)を書きました。 – Fabricio

+0

それは単純なタイプミスです – user776686

答えて

1

あなたが言ったことは何も得られませんでしたstartWith。私はこれがうまくいくと理解しています:

this.toggleClicks$ = Observable.fromEvent(this.viewAllToggle.nativeElement, 'click') 
     .scan(prev => !prev, false) 
     .startWith (false); // OR TRUE, dont know what behaviour you seek 

this.itemsArray$ = Observable.of([ /* array of any */ ]); 

this.viewLimit$ = this.itemsArray$ 
     .withLatestFrom(this.toggleClicks$, (items, viewAll) => { 
     return viewAll 
      ? { nowLimit: items.length, otherLimit: 5 } 
      : { nowLimit: 5, otherLimit: items.length }; 
     }) 
     .share(); 

これはあなたの試みですか?

withLatestFrom(obs$)演算子を使用すると難しいのは、obs$が最初の値を出力するまで何も出力されないということです。これは、セレクタ関数(ここではviewAll)に渡す値がないため、論理的な動作です。デフォルトではundefinedを渡すことは、必ずしも賢明な選択ではないかもしれません。イベントとビヘイビアの区別について知っているならば、この背後にある論理的根拠は、いつでもいつでも値を持つビヘイビアで使用されるwithLatestFromです。

+0

はい、それは私が試したことです、私は 'combineLatest'でも試しました。どちらの場合も、ボタンを最初にクリックするまで効果はありません。それでも、最初のクリックの前に、HTMLが有効なデフォルト状態になるようにしたいのですが、 "Show Show" – user776686

+0

ベストな方法はjsfiddleを投稿することです。しかし、実際に 'Observable.of'を使うと、' itemsArray $ 'は一度しか出ません。値を一つずつ出そうとするなら 'from'を使うべきです。それで、あなたが書いた方法で 'startWith'を使うと、あなたが書いていることは起こり得ません。それを見るための簡単な方法は、' tap'命令を追加することです。 https://jsfiddle.net/tmd4ksem/をご覧ください。したがって、アプリケーションを短期間でデバッグするには、演算子が必要な方法で動作することがわかっています。 – user3743222

関連する問題