angular - 如何通过 RXJS 中的另一个 observable 修改 observable 流?角
问题描述
我想在我的ships$
when 标志areShipsExpanded$
将更改时更改嵌套标志。我怎样才能做到这一点。这是我到目前为止所拥有的:
areShipsExpanded$: Observable<boolean>;
ships$: Observable<Ship>;
constructor() {
this.ships$ = this.shipsDataSource.getData().pipe(shareReplay());
}
ngOnInit(): void {
this.areShipsExpanded$.pipe(
map(flag => {
if (flag) {
this.ships$.pipe(map(s => s.items.forEach(r => r.isExpanded = flag)));
}
})
).subscribe();
}
不幸的是,ships$ 似乎没有被修改,或者我应该以某种方式刷新这个ships$
observable,因为我以这种方式在我的视图中使用它:<ng-container *ngFor="let ship of (ships$ | async)?.items">
@编辑
我是这样做的,是正确的,还是不好的做法?
this.areShipsExpanded$.pipe(
map(flag => {
if (flag) {
this.ships$ = this.ships$.pipe(map(s => {
s.items.forEach(r => r.isExpanded = flag);
return s;
}));
}
})
).subscribe();
@EDIT2
我用过combineLatest
,现在应该可以了吧?
shipsData$: Observable<Ship>;
ships$: Observable<Ship>;
constructor() {
this.shipsData$ = this.shipsDataSource.getData().pipe(shareReplay());
}
this.ships$ = combineLatest(this.areShipsExpanded$, this.shipsData$).pipe
map(([shipsExpanded, ships]) => {
ships.items.forEach(r => r.isExpanded = shipsExpanded);
return ships;
}),
share()
);
但问题是combineLatest
,一开始函数将运行 2 次,因为两个 observables 都会发出值。是否有任何替代运算符的行为类似于combineLatest
- 所以当任何 observable 发出一个值时,从每个 observable 发出最新值,但仅当所有 observable 都准备好时。避免一开始就重复。
解决方案
希望这可以帮助您:
const fetchData$ = this.shipsDataSource.getData().pipe(shareReplay());
this.ships$ = merge(
this.areShipsExpanded$.pipe(
withLatestFrom(fetchData$),
map(([shipsExpanded, ships]) =>
// we could try to favor immutability
ships.items.map(r => {...r, isExpanded:shipsExpanded})),
), // ships after update
fetchData$ // initial ships
).pipe(share());
推荐阅读
- jquery - JQuery 2-modal 冲突:需要“删除”animatedModal,但要使用 DELAY,以隐藏第二个模态的滚动条
- postgresql - 在postgresql中加入删除
- chatbot - 如何让我的聊天机器人只在下午 6 点到早上 8 点回答 - IBM Watson
- networkx - Draw Networkx Directed Graph using clustering labels as color scheme
- makefile - 为 FPGA 项目-Vivado 执行 Makefile 时出现问题
- c++ - 保存是在我的 vscode 代码中使“\n”在 c++ 中换行
- javascript - Sequelize:如果这些注册表之一具有特定密钥,我想返回与模型关联的所有注册表
- python - 在 Python 中合并数据集,类似于交叉连接
- c - 运行我的程序时出现分段错误(核心转储)错误
- sql - 如何使用 UNION 用另一个表中的值填充 NULL 值