RxJs + Angular Subject叫了两次

时间:2018-06-06 13:28:53

标签: angular ionic-framework rxjs reactivex

我试图在没有观察者的情况下实现可选择列表的逻辑,只是使用一系列可观察对象,这段代码可以解决但是有问题:

    ngOnInit()
    {
    //Every value emitted tells me if i have to select or unselect the current id.
    let sel_or_unsel = Observable.merge(
      this.idSelected$.map( id => { return {id : id, to_select : true} }),
      this.idUnselected$.map( id => { return {id : id, to_select : false}})
    )
    //Starting from an empty array, add or remove elements
    this.selected_ids$ = sel_or_unsel.scan( (selecteds : [number], id) => {

        if (id.to_select)
        {
          let a = Array.from(selecteds)  
          a.push(id.id)
          return a
        }

        else {
          return selecteds.filter( v => v != id.id)
        }

      }, new Array() )
      .merge(Observable.of(this.initial_selections))

    this.nonselected_ids$ = Observable.combineLatest(this.selected_ids$, this.tab_items$,
      (ids,table) => 
      {
          return _.difference(Array.from(table.keys()),ids)
      })


    this.selected_items$ = Observable.combineLatest(this.selected_ids$, this.tab_items$,
       (ids,table) => ids.map( (id) : [number,T] => [id, table.get(id)])  
    )

    this.nonselected_items$ = Observable.combineLatest(this.nonselected_ids$, this.tab_items$,
      (ids,table) => ids.map( (id) : [number,T]  => [id,table.get(id)])
    )

  }

idSelected $和idUnselected $是PublishSubjects(rxJS中的主题),只要在选定或未选择的项目上发生单击,我就会调用一个角度绑定:

selectItem(el : [number,T])
  { 
    console.log("SelectItem()")
    this.idSelected$.next(el[0])
  }

  unselectItem(el : [number,T])
  {
    console.log("unselectItem()")
    this.idUnselected$.next(el[0])
  }

当我呼叫接下来的运营商时,例如this.idSelected $ .next(3)关于主题,流程开始按预期工作:

  • this.idSelected $ .map(...)发出[3,true]
  • sel_or_unsel发出[3,true]
  • 使用参数([],[3,true])
  • 调用扫描运算符
  • 扫描操作员发出[3]

  • 那个过程重复

  • this.idSelected $ .map(...)发出[3,true]

  • sel_or_unsel发出[3,true]
  • 使用参数([],[3,true])
  • 调用扫描运算符
  • 扫描操作员发出[3]

最后结果是一样的,但我不明白为什么一切都会重复两次,我尝试使用enableProdMode()但没有改变。

编辑:代码就是我发布的内容,没有对可观察对象进行订阅。

0 个答案:

没有答案