2016-12-30 14 views
1

Observableを別のObservableの入力でフィルタリングしています。フィルタリングの入力はユーザーからのものです。ObservableからstartWithを使用してObservableを作成する

フィルタリングは、RxJS演算子combineLatestで行われます。これは、このストリームを購読するときに、両方のソースオブザーバブルからのエミッションが発生するまで値が出力されないことを意味します。ユーザー入力が行われる前に、作成されたストリームが作成時に(フィルタリングなしで)

startWith演算子を使用する必要があると思いますので、ストリームには生成時にエミッションがありますが、Observableからこれをシードする仕組みはできません。 Observableを使用するのはFirebaseからのデータで、FirebaseListObservableで処理されるためです。

以下は、私が現在やっていることをまとめたものです。

let tagInput = document.getElementById('tags'); 
let tagExclusionStream = Observable 
    .fromEvent(tagInput, 'input') 
    .map((e: any) => createsArrayFromInput(e.target.value)); 

let allTags: Observable<any[]> = getAllTags(); 

let filteredTags = allTags 
    .combineLatest(tagExclusionStream, (tags, tagExclusions) => { 
    return tags.filter((tag: any) => tagExclusions.indexOf(tag.$key) == -1) 
    }); 

// I want this to print out without needing the tagExclusionStream to emit first 
filteredTags.subscribe(tags => console.log("Tags:", tags)) 

/ここに私のアプローチは完全にオフになっているなら、私に知らせて、私はRxJSに新たなんだと、より良い方法がありますしてください。ストリーム上の放射を作成する - 私は、このアプローチが好き

let tagExclusionStream = Observable 
    .fromEvent(tagInput, 'input') 
    .map((e: any) => createsArrayFromInput(e.target.value)) 
    .startWith(''); 

答えて

1

は、私は、これはトリックを行うだろうと思いユーザ入力があるまでそれ以外の場合は出力しません。これはうまくいったので、これを指摘してくれてありがとう! TypeScriptのエラーを避けるために、startWithのパラメータを ` `の前に変更する必要がありました。私はまた、パラメータを `[]` `vs` `` `に変更しました。それは私の` tagExclusionStream`が放出するものです。
+0

:あなたはこれを行うことができます別の場所でtagExclusionStreamを使用している場合、代わりに

let filteredTags = allTags .combineLatest(tagExclusionStream.startWith(''), (tags, tagExclusions) => { return tags.filter((tag: any) => tagExclusions.indexOf(tag.$key) == -1) }); 

: –

関連する問題