我正在尝试根据 FormArray 中的特定值计算总值或其他值。
我发现当订阅valueChanges
并尝试将整个数组传递给类似reduce
的东西时,父 FormGroup 上不存在“新值”。
样本:
this.frm.get('arr')['controls'][i].valueChanges
.subscribe((newVal) => {
this.frm.get('total').patchValue(
this.frm.get('arr').value.reduce((acc, curr) => {
return acc + curr.v;
}, 0)
)
});
如果arr
有值[0, 1, 2, 3, 4]
并且我将第一个值更改为1
,我仍然得到10
而不是11
。
this.frm.get('arr').value
显示所有初始值而不是更新值。
我对 Reactive Forms 还很陌生,所以我确定我只是在这里遗漏了一些基本的东西。
更新(有一个解决方案,但我仍然缺乏理解):
我真的很想知道为什么我不能像 Eliseo 建议的那样订阅对整个数组的更改。
我也对为什么我使用的地方之间存在如此大的差异感兴趣.value
- 如果反应式表单的全部要点是模型驱动然后传递frm.value
给您的提交函数,那么为什么.value
整个表单层次结构如此不一致?
更新 2
在 Eliseo 更新后的指导下更新了 StackBlitz 解决方案
我找到了一个我感觉很好的解决方案。它没有controls
在任何地方使用,感觉非常干净。Eliseo 建议的方法促使我尝试这样做。我相信重要的是铸造 aFormArray
并在其上执行任何push
。这使该parent
字段与您的其余部分保持联系FormGroup
,FormArray
因此它仍然包含在valueChanges
事件中。
我现在相信 usingcontrols
是 Angular Reactive Forms 的反模式,但我需要寻找关于该主题的更多指导。