2016-12-01 8 views
0

EDIT:最終的に私の問題は、https://plnkr.co/edit/A2WipJwW9kEhhlh90xMjの吹き出しに行き着いた。選択したマーケットにヒットしたら、Enterキーを押してmarket-search.component.tsファイルのmarketSelectorDropDownメソッドに入ります。問題はマップの下の数行にあり、選択されたマーケットドロップダウンが再びクリックされるまで、購読は実行されません。私はなぜなのか理解していない。どんな助けでも大歓迎です!Angular2配列のObservableの最初の要素へのアクセス

this.markets 
     .map(markets => { 
      debugger 
      if(markets && markets.length > 0) return markets[0]; 
     }) 
     .subscribe((market: Market) => { 
      debugger 
      this.pick(market.name) 
     }); 

編集:解答としてマークされているのコメントに答えがあります。 BehaviorSubjectを使用することです。これにより、遅れた加入者は最後のイベントを送信できます。

答えて

2

引数なしで呼び出された場合

RxJS5ドキュメントによればまずオペレータ

、最初の完了次に、観測ソース の最初の値を発します。述語関数で呼び出された場合、最初に は、指定された 条件に一致するソースの最初の値を出力します。また、入力値から 出力値を生成するresultSelector関数と、 で有効な値を出力する前に出力するdefaultValueを生成することもできます。 defaultValueが指定されておらず、一致する要素が でない場合は、 がエラーを返します。それはあなたが例えばイベント

から観察可能に対処する場合、唯一のDOM(のようなjQueryので.one)に発生した最初のクリックを発する便利

var clicks = Rx.Observable.fromEvent(document, 'click'); 
var result = clicks.first(); 
result.subscribe(x => console.log(x)); 

それとも、で見ることができますこの回答の他のユースケースAngular 2 runOutsideAngular still change the UI

あなたが望むものではありませんが、このように使うことができます:

.first(null, arr => arr[0]).subscribe... 

、それは、配列Plunker Example(最初の)

の所望の最初の要素を返す必要がありますが、私は同じことを行うにはmapオペレータ活用します:

.map(arr => arr[0]).subscribe... 

Plunker Example(マップ)

+0

私が試したとき: 'this.markets .first(null、markets => markets [0]) .subscribe((market:Market)=> { this.pick(market。名前) }); 'サブスクライブするメソッドにブレークポイントを設定すると、決してヒットしません。 – avidgoffer

+0

これは1を返しませんか? https://jsfiddle.net/j86afj61/ – avidgoffer

+0

Angular2はrxjs5を使用します。私はプランカを追加しました。ダミーのjsonがあり、常に 'name1'を返します – yurzui

0

あなたが利用しているため、あなたの例は機能しませんgx CDN for RxJS 2、これにはRxJS 5が必要です。 CDNをバージョン5に置き換えようとしましたが、うまくいきました。

+0

ありがとうございました。私は例で間違ったバージョンを使っていたわけではないが、現実の世界の状況ではまだそれを稼働させることができないと思う。 – avidgoffer

+0

あなたのマークアップでは、(keydown.enter)を使用してみてください。大文字は使用しないでください。 – Avi

+0

イベントのケーシングは問題ではありません。あなたはこの[plunk](https://plnkr.co/edit/A2WipJwW9kEhhlh90xMj?p=preview)でできるようにイベントが発生します。問題は、私が地図の上に再表示して、新しいsearchTermが件名に追加されるまで、決して発射しないということです。 – avidgoffer

関連する問題