Angular-FormBuilder,如何对多个表单控件进行分组

时间:2018-10-24 09:23:30

标签: javascript angular forms formbuilder formgroups

我使用Formbuilder创建一个FormGroup:

myForm = this.fb.group(
            {
                title: [""],
                fixed_grade1: [""],
                fixed_value1: [""],
                fixed_grade2: [""],
                fixed_value2: [""],
                fixed_grade3: [""],
                fixed_value3: [""],
                fixed_grade4: [""],
                fixed_value4: [""]
            });

所有fixed_gradefixed_value都是输入和下拉列表。

我有4对,并且工作正常。

但是现在我想对它们进行分组,因此我不必一个一个地访问控制器中的每个值,每个值都myForm.get("fixed_grade1").value

但是我希望所有这些值都被归类为一个数组:

myArray: [{grade, value}, [grade, value}...]

所以我可以通过myArray[0].grade

来访问它们的值

我看到FormArray中没有一个FormBuilder,而不是将每个值映射到一个新数组,我只是似乎无法正确实现它。

要达到我所描述的正确语法是什么,准确地拥有4对成绩/分数,并且在所有具有这些成绩/分数对的最终数组中,我只有不不确定的值就很重要,因此,如果在我的表单中用户仅填写一对成绩/分数,那么我的myArray.length将为1。

1 个答案:

答案 0 :(得分:2)

您定义的FormGroup错误。您的FormGroup应该有FormArray个中的FormGroup个。在这两个FormGroup中,应该分别有两个FormControl用于gradevalue

将表单更改为此:

const grades = [
  {grade: 'Grade 1', value: 'Value 1'},
  {grade: 'Grade 2', value: 'Value 2'},
  {grade: 'Grade 3', value: 'Value 3'},
  {grade: 'Grade 4', value: 'Value 4'}
]

myForm = this.fb.group({
  title: [],
  grades: this.fb.array(this.grades.map(grade => this.fb.group({
    grade: [grade.grade],
    value: [grade.value]
  }))),
});

// OR

myForm = this.fb.group({
  title: [],
  grades: this.fb.array(this.grades.map(grade => this.fb.group({
    grade: [],
    value: []
  }))),
});
...
get gradesArray() {
  return (<FormArray>this.myForm.get('grades')).controls;
}
...
getArrayGroupControlByIndex(index) {
  return (<FormArray>this.myForm.get('grades'))
    .at(index);
}

这是在模板中使用它的方式:

<form [formGroup]="myForm">
  <input type="text" formControlName="title">
  <br>
  <div formArrayName="grades">
    <div *ngFor="let gradeGroup of gradesArray; let i = index;">
      <div [formGroupName]="i">
        Group {{ i + 1 }}
        <input type="text" formControlName="grade">
        <input type="text" formControlName="value">
      </div>
      <br>
    </div>
  </div>
</form>

这是您推荐的Sample StackBlitz