#javascript #angular #angular-reactive-forms #angular-forms #angular-formbuilder
#javascript #угловые #угловые реактивные формы #угловые формы #angular-formbuilder
Вопрос:
Мне нужно иметь FormControl для двух разных массивов под одним и тем же узлом, чтобы я мог добавлять и удалять соответствующий вложенный узел в заданной реактивной форме.
Ожидаемый формат JSON:
{
"title": null,
"days": [
{
"date": null,
"nodes": [
{
"type": "leg",
"from": null,
"to": null
},
{
"type": "activity",
"category": null
}
]
}
]
}
Я реализовал управление в day и node, для которых я смог добавлять и удалять поля формы соответственно, однако мне нужны отдельные элементы управления для типа leg и activity под узлами.
Есть ли какой-либо способ реализовать вложенный FormControl здесь?
Обновление: нужны две formgroups под массивом форм, пожалуйста, помогите реализовать в HTML.
initX() {
return this.fb.group({
'date': [],
'nodes': this.fb.array([
this.initY(),
this.initZ()
]),
});
}
initY() {
return this.fb.group({
'type': ['leg'],
'from': [],
'to': []
})
}
initZ() {
return this.fb.group({
'type': ['activity'],
'category':[],
'cost':[]
})
}
Ошибка: не удается найти элемент управления с путем: ‘дни -> 0 -> узлы -> 1 -> из’
Можно найти stackblitz примера кода здесь: https://stackblitz.com/edit/angular-ivy-fkgxrr
Комментарии:
1. Неясно, что вы подразумеваете под «мне нужны отдельные элементы управления для типа leg и activity под узлами», потому что в вашем примере у вас уже есть два разных метода с разными возвращаемыми структурами.
2. Привет @FrancescoColamonici Я смог отформатировать в формате JSON, однако в FormArray под HTML нет никаких элементов управления. Дни и узлы зацикливаются индивидуально с помощью отдельных элементов управления, я хочу, чтобы то же самое было сделано для этапа и действий, однако под узлами.
3. @FrancescoColamonici Я обновил свое описание.
Ответ №1:
ну, в моем другом ответе массив «узлов» выглядит так
[
{"type": "leg","from": null,"to": null,"category": null}
{"type": "leg","from": null,"to": null,"category": null}
]
Все необходимые для FormArray элементы имеют одинаковые свойства
Вопрос: узлы — это только массив с двумя элементами (один для элемента управления, а другой для категории управления)?
В этом случае days — это FormArray, каждый элемент представляет собой FormGroup с двумя peopleeries, один из которых представляет собой массив (не FormArray) с двумя элементами
form=new FormGroup({
title:new FormControl()
days:new FormArray([
date:new FormControl(),
nodes:[new FormGroup({...}),new FormGroup({..})]
])
})
в этом случае у вас может быть три геттера
get days():FormArray
{
return this.formGroup.get('days') as FormArray;
}
get leg(index)
{
return this.days.at(i).get('nodes')[0] as FormGroup
}
get category(index)
{
return this.days.at(i).get('nodes')[1] as FormGroup
}
И использовать непосредственно [formGroup]
в div, например
<div [formGroup]="category[i]">
<input formControlName="from">
...
</div>
иначе я не могу понять ваш json
Ответ №2:
Попробуйте использовать двустороннюю привязку данных. Это упростит ваш процесс.
Например:
<input type="text" name="name" [(ngModel)]="model.name">
Ответ №3:
keethama, шаг за шагом. У вас есть FormArray внутри FormArray, поэтому создайте две функции, которые возвращают FormArray
get days():FormArray
{
return this.formGroup.get('days') as FormArray;
}
getNodes(i:number):FormArray
{
return this.days.at(i).get('nodes') as FormArray
}
Ну, чтобы создать форму, разделите и используйте три функции:
createForm(data:any)
{
data=data || {title:null,days:null}
return new FormGroup({
title:new FormControl(data.title),
days:data.days?
new FormArray(data.days.map(d=>this.createDays(d))):
new FormArray([])
})
}
createDays(data:any=null)
{
data=data || {date:null,nodes:null}
return new FormGroup({
date:new FormControl(data.date),
nodes:data.nodes?
new FormArray(data.nodes.map(x=>this.createNodes(x))):
new FormArray([])
})
}
createNodes(data:any=null)
{
data={type:null,from:null,to:null,category:null,...data}
return new FormGroup({
type: new FormControl(data.type),
from: new FormControl(data.from),
to: new FormControl(data.to),
category: new FormControl(data.category)
})
}
Ну, теперь взгляните на .html
<form *ngIf="formGroup" [formGroup]="formGroup">
title:<input formControlName="title">
<div formArrayName="days">
<div *ngFor="let groupDays of days.controls;let i=index" [formGroupName]="i">
date:<input formControlName="date">
<div formArrayName="nodes">
<div *ngFor="let groupnodes of getNodes(i).controls;let j=index" [formGroupName]="j">
type:<input formControlName="type"><br/>
from:<input formControlName="from"><br/>
to:<input formControlName="to"><br/>
category:<input formControlName="category">
</div>
</div>
</div>
</div>
</form>
И в ngOnInit
this.formGroup=this.createForm(this.data)
Посмотрите, что если вы хотите добавить новый узел к узлу в индексе index, который вы используете
this.getNodes(index).push(this.createNodes())
И добавить новый узел в массив дней
this.days.push(this.createDays())
Комментарии:
1. Привет .. Спасибо за пример кода, однако код здесь по-прежнему имеет тот же FormArray и элементы управления для всех узлов. Мне нужны элементы управления для этапа и активности отдельно под узлами. Есть ли какие-либо возможные предложения?
2. узлы — это только массив с двумя элементами (один для элемента управления, а другой для категории управления)? Если true, посмотрите мой другой ответ, иначе я не могу понять ваш json.
Ответ №4:
Я вижу, что это может быть не полный ответ, потому что рабочий образец с вложенными массивами форм займет некоторое время, но я уверен, что вы найдете интересную и полезную эту статью (которая помогла мне во многих подобных ситуациях):