Как создать formArray из данных
Представьте, что у вас есть данные типа
[
{code: 'one',desc: 'One1',id: 1},
{code: 'two',desc: 'Two1',id: 2},
{code: 'three',desc: 'Three1',id: 3}
]
. Для создания formArray полезно иметь функцию, которая получает объект и возвращает FormGroup
createFormGroup(data):FormGroup
{
data=data|| {code:'',desc:'',id:0}
return new FormGroup({
code:new FormControl(data.code,Validators.required),
desc:new FormControl(data.desc,Validators.required),
id:new FormControl(data.id,Validators.required)
})
}
если мы вызываем функцию с объектом, возвращаем formGroup, если мы вызываем функцию с нулем, возвращаем также FormGroup с пустыми элементами
Когда у вас есть данные, вы можете сделатьsimple
this.myFormArray=new FormArray(this.data.map(x=>this.createFormGroup(x)))
То есть каждый элемент данных, преобразованный в formGroup, formArray будет массивом с этими элементами.map преобразует каждый элемент «x» в «this.createFormGroup (x)» *
Если у вас есть служба, которая возвращает данные, на которые вы подписаны
this.myService.getData().subscribe(res=>{
this.myFormArray=new FormArray(res.map(x=>x.this.createFormGroup(x)))
})
// у вашей службы есть метод, подобный
getData()
{
return this.httpClient("http:myUrl")
}
Преимущество этого подхода в том, что для добавления нового элемента в FormArray вам нужно всего лишь сделать
this.formArray.push(this.createFormGroup(null))
Удалить
this.formArray.removeAt(index)
In stackblitz имеет небольшой пример всего этого.Ну, в сервисе я использую оператор rxjs of
, как правило, был httpClient.get (url).Только я ставлю часть создания formArray,
ПРИМЕЧАНИЕ. Я использую конструктор FormGroup и конструктор FormArray, но вы можете использовать BuilderForm, например,
createFormGroup(data):FormGroup
{
data=data|| {code:'',desc:'',id:0}
return this.fb.group({
code:[data.code,Validators.required],
desc:[data.desc,Validators.required],
id:[data.id,Validators.required]
})
}
И использовать
myFormArray=this.fb.array(res.map(x=>x.this.createFormGroup(x)))