2016-12-30 2 views
1

Observable의 입력으로 Observable을 필터링 중입니다. 필터링 입력은 사용자가 제공합니다.Observable에서 startWith를 사용하여 Observable 만들기

필터링은 RxJS 연산자 combineLatest을 사용하여 수행됩니다. 즉,이 스트림을 구독 할 때 소스 Observables에서 방출이 발생할 때까지 아무런 값도 방출되지 않습니다. 사용자 입력이 발생하기 전에 생성 된 스트림을 필터링없이 생성하고자 할 것입니다.

나는 startWith 연산자를 사용하여 스트림에 생성시 방출이 발생해야한다고 생각하지만 Observable에서이 값을 시드하는 방법을 알아낼 수 없습니다. 데이터가 Firebase에서 제공되고 FirebaseListObservable의 것으로 처리되므로 Observable을 사용합니다.

다음은 현재 내가하고있는 일의 결합 된 버전입니다.

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) }); 

: –

관련 문제