首页 > 解决方案 > RxJs+Angular Subject 调用了两次

问题描述

我正在尝试在没有观察者的情况下实现可选列表的逻辑,只需使用一系列可观察对象,这段代码就可以工作,但有一个问题:

    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) 时,流程开始按预期工作:

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

编辑:代码正是我发布的,没有订阅 observables。

标签: angularionic-frameworkrxjsreactivex

解决方案


推荐阅读