如何递归复制到一个formgroup



我们正在尝试构建一个通用表组件,其中可以将项目添加到表或单独编辑。该表具有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中的每个控件。

最新更新