首页 文章

使用Observable中的startWith创建一个Observable

提问于
浏览
1

我正在使用另一个 Observable 的输入过滤 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 回答

  • 3

    我认为这样可以解决问题:

    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('');
    

相关问题