角9反应形式;具有嵌套FormArray的FormGroup的PatchValue



我有一项任务要维护现有项目。该应用程序有一个FormGroup帮助程序,可以将所有数据转换为FormGroup格式。FormGroup包含嵌套的(4(FormArray,我想做的是将FormGroup的所有数据一起更新,所有嵌套的FormArray都来自FormGroup 的根

form: FormGroup
this.form.patchValue(dataToUpdateWithNested4FormArray)

创建plunkr:https://plnkr.co/edit/lKiCc7n2NEckQAXd?preview

plunkr;要查看输出,需要打开控制台日志

我已经为此挣扎了几天,希望任何人都能帮助我,

谢谢!

当你有一个如此复杂的FormGroup时,很好地使用辅助函数来帮助你创建不同的formArrays:

setToy(data:any=null)
{
data=data || {toy:null,brand:null}
return new FormGroup({
toy:new FormControl(data.toy),
brand:new FormControl(data.brand)
})
}
setFriend(data:any=null)
{
data=data || {name:null,school:null,toys:null}
return new FormGroup({
name:new FormControl(data.name),
school:new FormControl(data.scholl),
toys:new FormArray(data.toys?data.toys.map(x=>this.setToy(x)):[]
)
})
}
setKid(data:any=null){
data=data ||{name:null,age:0,friends:null}
return new FormGroup({
name:new FormControl(data.name),
age:new FormControl(data.age),
friends:new FormArray(data.friends?data.friends.map(x=>this.setFriend(x)):[])
})
}
setForm(data:any=null){
data=data ||{name:null,age:0,kids:null}
return new FormGroup({
name:new FormControl(data.name),
age:new FormControl(data.age),
kids:new FormArray(data.kids?data.kids.map(x=>this.setKid(x)):[])
})

}

查看如何连接函数以获得数组。

一个简单的

this.form=this.setForm(data)

只需使用您的数据创建一个formGroup。更进一步,我想你想操纵这个复杂的表格Group。和往常一样,我们管理formArray,我们可以生成返回formArray的函数。再次看到一个函数调用另一个函数

getKids(){
return this.form.get('kids') as FormArray
}
getFriends(index:number){
return this.getKids().at(index) as FormArray
}
getToys(index1:number,index2:number){
return this.getFriends(index1).at(index2) as FormArray
}

查看如何轻松添加新玩具、新朋友或新孩子

addToy(index1:number,index2:number){
this.getToys(index1,index2).push(this.setToy())
}
addFriend(index:number){
this.getFriends(index).push(this.setFriend())
}
addKid(){
this.getKids().push(this.setKid())
}

或删除

removeToy(index1:number,index2:number,index3:number){
this.getToys(index1,index2).removeAt(index3)
}
removeFriend(index1:number,index2:number){
this.getFriends(index1).removeAt(index2)
}
removeKid(index:number){
this.getKids().removeAt(index)
}

返回formArray的函数还帮助我们在.html 中进行迭代

<form [formGroup]="form">
....
<div *ngFor="let kid of getKids().controls;let i=index" [formGroupName]="i">
...
<div *ngFor="let friend of getFriends(i).controls;let j=index" [formGroupName]="j">
...
<div *ngFor="let toy of getToys(i,j).controls;let k=index" [formGroupName]="k">
...
</div>
</div>
</div>
</form>

它之所以无法进行修补,是因为它没有在FormArray元素中创建新条目。要解决此问题,可以在修补时在FormGroup中重新创建FormArrays。

patchFormGroups(formGroup: FormGroup, newData: object) {
formGroup.patchValue(newData);
for (let [key, value] of Object.entries(newData)) {
const formElem = formGroup.get(key);
if (formElem instanceof FormArray && Array.isArray(value)) {
formElem.clear();
for (let arrElem of value) {
formElem.push(this.fb.control(arrElem));
}
}
}
}

最新更新