Я пытаюсь реализовать логику выбираемого списка без наблюдателей, просто с цепочкой наблюдаемых, этот код работает, но с проблемой:
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) насубъектов, поток начинает работать, как и ожидалось:
В концеults одинаковы, но я не понимаю, почему все повторяется дважды, я пытался использовать enableProdMode (), но ничего не изменилось.
РЕДАКТИРОВАТЬ: код только то, что я опубликовал, подписки нанаблюдаемые.