在 angular 的表单控件中推送嵌套数组

pushing a nested array in a form control in angular

我在angular

中有这种结构的形式
this.myForm = this._fb.group({
      name: ["", Validators.required],
      description: ["", Validators.required],
      item: this._fb.array([
     ])
});

我正在使用这个函数来修补表单值

patchFormArray(item: any) {
   let ctrl = <FormArray>this.myForm.controls.item;
    item.forEach(items => {
       const fb = this._fb.group({
         prefix:  [items?items.prefix:"", Validators.required],
         text: [items?items.text:"", Validators.required],
         Questiontype: [items?items.Questiontype:"", Validators.required],
         options: this._fb.array([ ])
       })
        fb.patchValue(item);
        ctrl.push(fb);
      })
   }

   patchFormData(data: any){
      this.myForm.patchValue({
         name: data.name,
         description: data.description
      })
   }

我想修补项目数组中选项数组的值。我已经尝试使用此功能,但它仍然无法正常工作。添加了 InitOptionArray 函数但仍然无法正常工作

patchOptionsArray(items:any){
  var index = 0
     items.forEach(item => {
       let Optionsctrl = <FormArray>this.myForm.get(['item', index, 'options']);
          items[index].options.forEach(option => {
               Optionsctrl.push(
                 this._fb.group({
                   value:  [option?option.value:""]
                 })
               )
          });
         index = index + 1;
   });
}

在 angular 中的反应式表单中管理 formArray 可能很复杂。我创建了我的 on 模式来开发和保持我的代码尽可能干净,我将告诉你我如何使用 formArrays inside

管理我的反应式表单

假设你有一个 formGroup,里面有一个 formArray

this.myForm = this._fb.group({
        name: this._fb.control("",[Validators.required]),
        description: this._fb.control("",[Validators.required]),
        item: this._fb.array([])
  });

请注意,我将 formArray 声明留空,因为我将使用一种方法来管理内部的 formGroups

我要创建一个方法,return 我的项目数组来自 formGroup,这个方法将无处不在

get items(): FormArray {
  return this.myForm.get("items") as FormArray
}

现在:如何在formArray 中声明一个表单组? ,此方法将接受值,例如我将要设置的可选参数值

addItem(values?: any) {
  const tempFormGroup = this._fb.group({
    prefix: this._fb.control("",[Validators.required]),
    options:this._fb.array([]), //adding the array field
  })

 if(values) {
  tempFormGroup.setValue(values)
 }
 this.items.push(tempFormGroup)
}

如何删除表单数组中的表单组?您将需要要删除的特定表单组的索引

removeItem(index:number ) {
   this.items.removeAt(index)
 }

如果您的内部 formControl 中有另一个 formArray,您将需要以与他的父级相同的方式处理它

已更新

如果第一个数组中有另一个数组,则需要知道两个索引才能管理第二个数组

options(index:number):  FormArray {
  return this.items.at(index).get("options") as FormArray
}

addOptions(itemIndex:number, values?:any) {
  this.options(index).push(this._fb.group({...}))
}

removeOptions(itemIndex:number,optionIndex:number){
  this.options(itemIndex).removeAt(index)
}

如果您需要更多帮助,请告诉我

问候