我试图在没有观察者的情况下实现可选择列表的逻辑,只是使用一系列可观察对象,这段代码可以解决但是有问题:
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)关于主题,流程开始按预期工作:
扫描操作员发出[3]
那个过程重复
this.idSelected $ .map(...)发出[3,true]
最后结果是一样的,但我不明白为什么一切都会重复两次,我尝试使用enableProdMode()但没有改变。
编辑:代码就是我发布的内容,没有对可观察对象进行订阅。