当我获得数据时,我不能动态地创建表单控件。以及值,特别是类似formControl的任务和模板名称。提前谢谢。
{
"items": [
{
"templatename": "Defult",
"tasks": [
"task-1",
"task-2 ",
"task-3",
]
},
{
"templatename": "Eccormce",
"tasks": [
"task-1 ",
"task-2",
]
},
{
"templatename": "co-oprate",
"tasks": [
"task-1",
"task-2",
"task-3"
]
}
]
}发布于 2020-09-04 14:32:05
我建议你迭代你的json值,然后创建不同的控件。
在初始化时,您可以创建第一个FormArray,然后获取它并将其推入json的所有items,最后对表示任务的其他FormArray执行相同的操作
ngOnInit(){
const items = this.json.items
this.form = new FormGroup({
items : new FormArray([])
})
let itemsForm = (<FormArray>this.form.get('items'))
for (let i = 0; i < items.length; i++){
itemsForm.push(this.initItem(items[i]))
}
}
initItem(item){
let itemGroup = new FormGroup({
templatename : new FormControl(item.templatename),
tasks : new FormArray([])
})
let tasksItem = (<FormArray>itemGroup.get('tasks'))
for (let i = 0; i < item.tasks.length; i++){
tasksItem.push(new FormControl(item.tasks[i]))
}
return itemGroup;
}当然,这是两次相同的迭代,只是FormArray和您放入其中的内容发生了变化,所以您可能可以在单个方法中对其进行分解,但这里只是向您展示如何进行嵌套FormArray
Here是一个工作堆栈闪电战,您可以在其中测试示例
发布于 2020-09-04 14:53:10
创建FormArrays的FormArray的过程与其他过程相同。唯一的问题是考虑如何引用formArrays。因此,首先创建两个辅助函数
//it's a typical getter
//if you manage the formArray directly it's not necesary(*)
get itemsArray()
{
return this.form.get("items") as FormArray
}
//see that this function is NOT a getter -has as argument an index-
getTasks(index:number)
{
this.itemsArray.at(index).get('tasks') as FormArray
}而且,如果外部formArray是一个返回formGroup的典型函数
setItemsArray(data: any = null): FormGroup {
data = data || { templatename: null, tasks: null };
return new FormGroup({
templatename: new FormControl(data.templatename, Validators.required),
tasks: data.tasks
? new FormArray(data.tasks.map(x => new FormControl(x)))
: new FormArray([])
});
}因此,我们可以使用以下命令创建formArray
const items=new FormArray(alldata.map(x=>this.setItemsArray(x))现在,我们准备好处理formArray
<form [formGroup]="form">
<div formArrayName="items">
<div *ngFor="let group of itemsArray.controls;let i=index"
[formGroupName]="i">
<!--here we has a inner formGroup--->
<input formControlName="templatename">
<div formArrayName="tasks">
<div *ngFor="let control of getTasks(i).controls;let j=index">
<input [formControlName]="j">
</div>
</div>
</div>
</div>
</form>奖励:
要在某个位置添加/删除新任务,只需
addTask(index:number)
{
this.getTask(index).push(new FormControl())
}
removeTask(index:number,indexTask:number)
{
this.getTask(index).removeAt(indexTask)
}添加/删除项目的步骤
addItem()
{
this.itemsArray.push(this.setItemsArray())
}
removeItem(index:number)
{
this.itemsArray.removeAt(index)
}(*)如果您愿意,您还可以在FormGroup中管理formArray独立-not -
如果您直接定义
this.formArray=new FormArray(alldata.map(x=>this.setItemsArray(x))并将函数索引(GetTasks)更改为
getTasks(index)
{
return this.formArray.at(i).get('tasks') as FormArray
}您可以使用像这样的表单
<form [formGroup]="formArray">
<div *ngFor="let group of formArray.controls;let i=index"
[formGroupName]="i">
<!--here we has a inner formGroup--->
<input formControlName="templatename">
<div formArrayName="tasks">
<div *ngFor="let control of getTask(i).controls;let j=index">
<input [formControlName]="j">
</div>
</div>
</div>
</form>你可以看到a stackblitz
https://stackoverflow.com/questions/63734864
复制相似问题