2016-12-30 5 views
1

Я фильтрую Observable с помощью ввода другого Observable - вход для фильтрации поступает от пользователя.Создание наблюдаемого с использованием startWith from Observable

Фильтрация выполняется оператором RxJS combineLatest. Использование этого означает, что при подписке на этот поток никакие значения не выделяются до тех пор, пока не произойдет излучение обоих источников Observables - я хотел бы, чтобы созданный поток излучал при создании (без какой-либо фильтрации), прежде чем произойдет какой-либо пользовательский ввод.

Я думаю, что я должен использовать оператора startWith, поэтому поток имеет излучение при создании, но я не могу решить, как его засеять из наблюдаемого. Использование 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

Мне нравится этот подход - создание излияние на поток которые иначе не выдавали бы до ввода пользователя. Это сработало, поэтому спасибо, что указали это! Мне пришлось изменить параметр startWith, которому предшествует '', чтобы избежать ошибки TypeScript. Я также изменил параметр как '[]' vs '''', так как это испускает мой 'tagExclusionStream'. –

Смежные вопросы