我正在尝试根据 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 的反模式,但我需要寻找关于该主题的更多指导。