在表单组 angular 中循环遍历表单数组
Looping through form array inside form group angular
我从服务器获取数据列表,我想在 跨度列表 中显示它们,如下所示:
每一行对应列表的一项,请注意,我使用 *ngFor
创建此列表,如下所示:
this.myForm = this.fb.group({
person: this.fb.array([
this.fb.group({
name: [''],
address: ['']
})
])
})
<form [formGroup]="myForm">
<div formArrayName="person" *ngFor="let person of serverData; let personIndex = index">
<div [formGroupName]="personIndex">
<input formControlName="name"/>
<input formControlName="address"/>
</div>
</div>
</form>
在 运行 这段代码之后,浏览器给我这个:
错误:
No value accessor for form control with path: 'person -> 0 -> name'
但我知道我应该在 for 循环中使用 myForm.controls.person.controls
而不是 serverData
,但我想要 both 列表和控件在一起。
我应该使用两个 for 循环,其中一个循环遍历服务器数据,另一个循环遍历表单控件,还是我应该使用另一种方式?
注意:我喜欢循环是 n 的 div of fromGroupName
<form [formGroup]="myForm">
<div formArrayName="person"> >
<div *ngFor="let person of serverData; let personIndex = index"
[formGroupName]="personIndex">
<span formControlName="name">{{person.name}}</span>
<span formControlName="address">{{person.address}}</span>
</div>
</div>
</form>
如果您遍历 myForm.controls.person.controls,则 formGroupName 始终具有值,如果您有一个数组并在创建表单之前声明,在应用程序的第一个状态下,不会创建 FormArray
您必须将 serverData
中的所有对象推送到您的 formarray,以便数组长度与 serverData
数组相同。您的模板保持当前状态,但在组件中,映射 serverData
中的值并将具有您想要的属性的对象推送到 formarray:
constructor(private fb: FormBuilder) {}
ngOnInit() {
this.myForm = this.fb.group({
persons: this.fb.array([])
});
this.data();
}
get person() {
return this.myForm.get("persons") as FormArray;
}
private data() {
this.serverData = [
{
name: "1",
desc: "one"
},
{
name: "2",
desc: "two"
},
{
name: "3",
desc: "three"
}
];
this.serverData.map(d =>
this.person.push(this.fb.group({ name: d.name, address: d.desc }))
);
}
演示:STACKBLITZ
我从服务器获取数据列表,我想在 跨度列表 中显示它们,如下所示:
每一行对应列表的一项,请注意,我使用 *ngFor
创建此列表,如下所示:
this.myForm = this.fb.group({
person: this.fb.array([
this.fb.group({
name: [''],
address: ['']
})
])
})
<form [formGroup]="myForm">
<div formArrayName="person" *ngFor="let person of serverData; let personIndex = index">
<div [formGroupName]="personIndex">
<input formControlName="name"/>
<input formControlName="address"/>
</div>
</div>
</form>
在 运行 这段代码之后,浏览器给我这个:
错误:
No value accessor for form control with path: 'person -> 0 -> name'
但我知道我应该在 for 循环中使用 myForm.controls.person.controls
而不是 serverData
,但我想要 both 列表和控件在一起。
我应该使用两个 for 循环,其中一个循环遍历服务器数据,另一个循环遍历表单控件,还是我应该使用另一种方式?
注意:我喜欢循环是 n 的 div of fromGroupName
<form [formGroup]="myForm">
<div formArrayName="person"> >
<div *ngFor="let person of serverData; let personIndex = index"
[formGroupName]="personIndex">
<span formControlName="name">{{person.name}}</span>
<span formControlName="address">{{person.address}}</span>
</div>
</div>
</form>
如果您遍历 myForm.controls.person.controls,则 formGroupName 始终具有值,如果您有一个数组并在创建表单之前声明,在应用程序的第一个状态下,不会创建 FormArray
您必须将 serverData
中的所有对象推送到您的 formarray,以便数组长度与 serverData
数组相同。您的模板保持当前状态,但在组件中,映射 serverData
中的值并将具有您想要的属性的对象推送到 formarray:
constructor(private fb: FormBuilder) {}
ngOnInit() {
this.myForm = this.fb.group({
persons: this.fb.array([])
});
this.data();
}
get person() {
return this.myForm.get("persons") as FormArray;
}
private data() {
this.serverData = [
{
name: "1",
desc: "one"
},
{
name: "2",
desc: "two"
},
{
name: "3",
desc: "three"
}
];
this.serverData.map(d =>
this.person.push(this.fb.group({ name: d.name, address: d.desc }))
);
}
演示:STACKBLITZ