2016-12-30 85 views
1

我正在篩選Observable,輸入另一個Observable - 用於篩選的輸入來自用戶。使用來自Observable的startWith創建Observable

過濾使用RxJS操作符combineLatest完成。使用這意味着,當訂閱這個流時,沒有值被髮射,直到從兩個源Observable發出 - 我希望創建的流在創建時發出(沒有任何過濾),在任何用戶輸入發生之前。

我想我應該使用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一種更好的方式。

回答

1

我認爲這將這樣的伎倆:

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

另外,如果你在不同的地方使用tagExclusionStream你可以這樣做:

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

我喜歡這種方法 - 建立在流上的發射直到有用戶輸入纔會發射。這工作,所以謝謝你指出這一點!爲了避免TypeScript錯誤,我必須將「startWith」的參數更改爲「」。我也改變了參數''''''''''這就是我的'tagExclusionStream'發出的。 –

相關問題