【发布时间】:2020-03-04 12:56:17
【问题描述】:
我正在重写一些代码以使用 RXJS 和角度异步管道。代码相当简单,我们将从数组中添加和删除项目。有没有比使用 Tap set 将状态存储在 BehaviorSubject 中更好的方法来完成操作共享数组?
this.listSubject = new BehaviorSubject(['a','b','c']);
this.addSubject = new Subject<string>();
this.addAction$ = this.addSubject.asObservable().pipe(
withLatestForm(this.listSubject),
map(([itemToAdd, list]) => {list.push(itemToAdd); return list;}),
tap((data) => this.listSubject.next(data))
);
this.removeSubject = new Subject<number>();
this.removeAction$ = this.removeSubject.asObservable().pipe(
withLatestForm(this.listSubject),
map(([indexToRemove, list]) => {list.splice(indexToRemove, 1); return list;}),
tap((data) => this.listSubject.next(data))
);
this.list$ = merge(this.addAction$, this.removeAction$);
编辑:UI 代码使用异步管道,
list$ | async
【问题讨论】:
-
这是一个糟糕的设计,您很可能会在控制台上看到 ExpressionChangedAfterItHasBeenCheckedError 异常,因为更改检测可以管理通过在这样的点击中改变数据所做的更改。
-
我使用
ChangeDetectionStrategy.OnPush而不是默认策略。
标签: angular typescript rxjs