如何递归复制FormGroup?

时间:2017-02-18 23:51:41

标签: angular

我们正在尝试构建通用表组件,其中项可以添加到表中或单独编辑。该表格有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}}

那么有没有一种很好的方法来复制表格并保持所有角度参考?或者有没有办法我们可以修改我们的自定义表单复制方法,仍然能够区分应该是组的属性和哪些应该是控件?

1 个答案:

答案 0 :(得分:0)

我能够通过编写基于FormGroup而不是表单值复制的自定义表单复制功能来解决此问题。使用isinstance足以弄清楚应该如何复制FormGroup中的每个控件。