RxJs + угловой субъект, вызываемый дважды - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь реализовать логику выбираемого списка без наблюдателей, просто с цепочкой наблюдаемых, этот код работает, но с проблемой:

    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]

  • THENПРОЦЕСС ПОВТОРЯЕТ

  • this.idSelected $ .map (...) испускает [3, true]

  • sel_or_unsel испускает [3, true]
  • Оператор сканирования вызывается с параметрами ([], [3, true])
  • Оператор сканирования выдает [3]

В концеults одинаковы, но я не понимаю, почему все повторяется дважды, я пытался использовать enableProdMode (), но ничего не изменилось.

РЕДАКТИРОВАТЬ: код только то, что я опубликовал, подписки нанаблюдаемые.

...