angular - 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) 时,流程开始按预期工作:
- 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() 但没有任何改变。
编辑:代码正是我发布的,没有订阅 observables。
解决方案
推荐阅读
- flutter - 我不想让弯曲的容器堆叠在 SliverAppBar 上 - Flutter
- java - 为什么这个 GUI 计数器在 9 之后不能显示?
- orocommerce - php bin/console assets:install --symlink 不工作
- python - 作为 Jupyter Notebook 的 DataCamp 的自动 Python 代码建议体验?
- docker - docker compose build时nuget下载资源失败
- python - 请求库无法解析代理
- lambda - 如何模拟在 lambda 处理程序中调用的函数
- javascript - 如何获取当前目录中的所有文件夹并使用 javascript 访问它们的数据?
- ffmpeg - ffmpeg 无法打开文件。尝试命令时出现 I/O 错误
- python - 如何将 SQL 存储过程读入 pandas 数据帧?