如何解决NGRX使用CombineLatest
我的Angular项目有一个NGRX存储,其中存储着plan
的状态。我的plan
对象包括一组称为locations
的位置。我订阅了RXJS combineLatest
来监视对包括locations
在内的多个值的更改。如果任何值发生变化,我将执行各种计算,并需要将更新后的locations
保存到NGRX存储中。
我无法阻止无限循环,其中combineLatest
中的值会更改,执行计算,创建新的plan
并创建名为{{1 }}(因为它们都是不可变的),我更新了locations
,updatedLocations
中的某些值,并最终调度了一个操作来更新Store中的locations
。但是我的updatedPlan.locations = updatedLocations
看到plan
已更改,整个过程再次开始。
代码摘要如下:
combineLatest
任何建议将不胜感激。
解决方法
您有此问题,因为您存储的是反模式的派生状态-请参见https://medium.com/@m3po22/stop-using-ngrx-effects-for-that-a6ccfe186399的“重复/派生状态”
本质上,updatedLocations
是从其他状态派生的,因此您应该:
- 像现在一样在您的状态下存储
locations
,foo
,bar
- 创建一个选择器,从这三个列表中计算出更新的位置
const selectUpdatedLocations = createSelector(
selectLocations,selectFoo,selectBar,calculateUpdatedLocations
);
function calculateUpdatedLocations(locations,foo,bar){
// Create new Locations so I can change values.
const updatedLocations = [...locations.map(l => ({ ...l }))];
return updatedLocations;
}
我怀疑类似的事情将适用于Plan
-即:使用选择器从状态和selectUpdatedLocations
的信息中构建计划,而不是存储计划本身。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。