我们正在尝试构建一个通用表组件,其中可以将项目添加到表或单独编辑。该表具有addForm
FormGroup
,用于编辑项目,然后将其添加到表单中。将项目从addForm
添加到使用Lodash的cloneDeep()
的FormArray
中。
我们现在遇到的问题正在编辑一行。表中的每一行都有一个与整体组件上存在的editForm
绑定的表单。这个想法是将值从FormArray
中复制到editForm
中,然后使用户可见表单。不幸的是,我们遇到了一些更复杂的形式的问题,我们正在尝试将这些表组件彼此嵌套。我尝试了几种不同的方法,但是他们每个方法都有自己的陷阱...
使用_.clonedeep()
如果我用_.clonedeep()将FormArray
复制到editForm
,就像我们用来复制到FormArray
中一样,formControlName
绑定似乎被弄乱了。我猜这是因为替换 FormGroup
的到位将某些内部角引用弄乱到FormGroup
?我最终遇到了这个错误:
this.editForm = _.cloneDeep(this.formArray.controls[index]) as FormGroup;
Error: There is no FormControl instance attached to form control element with name: 'myControlName'
使用PatchValue()
我对此的另一项尝试是使用内置的patchValue()
,但看起来patchValue()
无法很好地处理FormArray
S。
this.editForm.patchValue((this.formArray.controls[index] as FormGroup).getRawValue());
> this.formArray.controls[0].controls['treatingPhysicians'].controls[0].controls
- Object
- address: FormGroup
- id: FormControl
- physicianFullName: FormControl
- __proto__: Object
> this.editForm.controls['treatingPhysicians'].controls[0].controls
- []
编写自定义复制功能
我们也有自己的自定义表单复制函数,不幸的是,它似乎也会在FormArray
s上堵塞,因为很难判断数组中对象上的属性是否应为控件或其他嵌套FormGroup
。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</p>
this.editForm = this.buildOutValues((this.formArray.controls[index] as FormGroup).getRawValue(), this.editForm);
> this.formArray.controls[0].controls['treatingPhysicians'].controls[0].controls
- Object
- address: FormGroup
- id: FormControl
- physicianFullName: FormControl
- __proto__: Object
> this.editForm.controls['treatingPhysicians'].controls[0].controls
- Object
- address: FormControl
- id: FormControl
- physicianFullName: FormControl
- __proto__: Object
那么,是否有一个很好的方法来复制形式并保持所有角度参考?还是有一种方法可以修改自定义表单复制方法,并且仍然能够区分应该是组的属性,哪些应该是控制?
我能够通过编写基于FormGroup
复制的自定义表单复制函数来解决此问题,而不是表单的值。使用isinstance
足以弄清楚如何复制FormGroup
中的每个控件。