我们正在尝试构建通用表组件,其中项可以添加到表中或单独编辑。该表格有addForm
FormGroup
,用于在将项目添加到表单之前对其进行编辑。将项目添加到addForm
时,将FormArray
复制到cloneDeep()
,并使用lodash' s editForm
。
我们现在遇到的问题是编辑一行。表中的每一行都有一个绑定到整个组件上存在的FormArray
的表单。我们的想法是将值从editForm
复制到FormArray
,然后将表单显示给用户。不幸的是,我们遇到了一些更复杂的形式的问题,我们试图将这些表组件嵌套在彼此之内。我尝试过几种不同的方法,但每种方法都有自己的方法......
使用_.cloneDeep()
如果我使用_.cloneDeep()从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
并不能很好地处理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
编写自定义复制功能
我们也有自己的自定义表单复制功能,不幸的是它似乎也在FormGroup
上窒息,因为很难判断数组中对象的属性是否应该是一个控件或另一个嵌套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
{{1}}
那么有没有一种很好的方法来复制表格并保持所有角度参考?或者有没有办法我们可以修改我们的自定义表单复制方法,仍然能够区分应该是组的属性和哪些应该是控件?
答案 0 :(得分:0)
我能够通过编写基于FormGroup
而不是表单值复制的自定义表单复制功能来解决此问题。使用isinstance
足以弄清楚应该如何复制FormGroup
中的每个控件。