[英]Angular - FormBuilder, how to group multiple Form Controls
我使用Formbuilder创建一个FormGroup:
myForm = this.fb.group(
{
title: [""],
fixed_grade1: [""],
fixed_value1: [""],
fixed_grade2: [""],
fixed_value2: [""],
fixed_grade3: [""],
fixed_value3: [""],
fixed_grade4: [""],
fixed_value4: [""]
});
所有fixed_grade
和fixed_value
都是输入和下拉列表。
我有4对,这正常工作。
但是现在我想对它们进行分组,因此我不必一个一个地访问控制器中的每个值,每个值都带有myForm.get("fixed_grade1").value
。
但我希望将所有这些值分组为一个数组,例如:
myArray: [{grade, value}, [grade, value}...]
所以我可以通过以下方式访问它们的值: myArray[0].grade
我看到没有将每个单个值映射到一个新数组,而是看到FormBuilder
有一个FormArray
,但我似乎无法正确实现它。
正确地使用4对成绩/分数来实现我所描述的语法是什么,而且重要的是,在具有所有这些成绩/分数对的最终数组中,我只有未定义的值,所以如果在我的表单中,用户仅填写一对成绩/分数,那么我的myArray.length
将为1。
您定义的FormGroup
错误。 您的FormGroup
应该具有FormArray
的FormGroup
。 在每个FormGroup
的内部,应该有两个用于grade
和value
FormControl
。
将您的表单更改为此:
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>
这是供您参考的示例StackBlitz 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.