这是我的建议。我假设你的 role 变量等于这个对象。
this.role = {
roleName: 'Test Role name',
menuGroup: [
{
title: 'menu group 1',
menuItems: [
{
title: 'group 1 item 1',
status: 'active'
},
{
title: 'group 1 item 2',
status: 'inactive'
}
]
},
{
title: 'menu group 2',
menuItems: [
{
title: 'group 2 item 1',
status: 'active'
},
{
title: 'group 2 item 2',
status: 'inactive'
},
{
title: 'group 2 item 3',
status: 'active'
}
]
}
]
};
您要做的是为每个menuItems 创建表单组并将它们添加到FormArray。然后您必须为每个menuGroup 创建FormGroups,并将它们添加到单个FormArray。最后如果你得到整个表单组的值应该是这样的。
{
"title": "Test Role name",
"menuGroups": [
{
"title": "menu group 1",
"items": [
{
"group 1 item 1": null,
"group 1 item 2": null
}
]
},
{
"title": "menu group 2",
"items": [
{
"group 2 item 1": null,
"group 2 item 2": null,
"group 2 item 3": null
}
]
}
]
}
像这样创建三个方法。
private buildForm(): void {
const formArray = this.fb.array([]);
this.form = this.fb.group({
title: [this.role.roleName],
menuGroups: formArray
});
this.role.menuGroup.forEach((menuGroup: MenuGroup) => {
formArray.push(this.buildSubFormGroup(menuGroup))
});
}
private buildSubFormGroup(menuGroup: MenuGroup): FormGroup {
return this.fb.group({
title: [menuGroup.title, Validators.required],
items: this.buildMenuItemFormGroup(menuGroup.menuItems)
});
}
private buildMenuItemFormGroup(menuItems: MenuItem[]): FormArray {
const formArray = this.fb.array([]);
const formGroup = this.fb.group({});
menuItems.forEach((menuItem: MenuItem) => {
formGroup.addControl(menuItem.title, new FormControl());
});
formArray.push(formGroup);
return formArray;
}
然后转到this 文章以获得清晰的想法。并使用此stackblitz 查看如何创建表单组和表单数组。