Ошибка при использовании setControl или patchValue в массиве угловых форм
Пожалуйста, помогите, у меня есть вложенный массив форм, как показано ниже:
this.form = this.formBuilder.group({
projectTitle: ['', [Validators.required, Validators.maxLength(300)]],
projectDescription: ['', [Validators.required, Validators.maxLength(300)]],
funding: this.formBuilder.array([this._buildFundingItems()]),
});
this._buildFundingItems()
как следует
private _buildFundingItems(): FormGroup {
return this.formBuilder.group({
items: ['', [Validators.required, Validators.pattern(this.regexValidation.shortWordRegex)]],,
amount: ['', [Validators.required, Validators.pattern(this.regexValidation.amountTypeRegex)]],
});
}
// after reloading the page, i get data from api and I tried setting the value as follows
this.form.setControl('funding', this.formBuilder.array(data.funding || []));
делать выше или this.form.setControl('funding', this.formBuilder.array(data.funding || []));
я получаю ошибку: Cannot find control with path: 'funding -> 0 -> amount'
а также Cannot find control with path: 'funding -> 0 -> items'
,
До того, как я сделал следующее ниже, я не получал никаких ошибок, но при обновлении формы или (на valuechanges), form array не обновлялся.
let length: number = data[0].funding.length;
while (length-- > 0) {
fundingSupport.push(this._buildFundingItems());
}
this.form.controls['funding'] = this.formBuilder.array([]);
this.form.controls['funding'].patchValue(data.funding)
Я увидел следующую ссылку Angular 4 patchValue на основе индекса в FormArray, поэтому я попробовал первый подход.
2 ответа
Сложно помочь, если мы не знаем, какие данные у вас есть или какие данные вы хотите получить. Я полагаю, что ваши данные были похожи
{
projecTitle:"title",
projectDescription:"description"
items:[{
items:"item 1",
amount:10
},
{
items:"item 2",
amount:5
}]
}
почему бы не использовать функцию для создания формы с данными?
createForm(data:any)
{
this.form = this.formBuilder.group({
projectTitle: [data?data.projecTitle:'', [Validators.required, Validators.maxLength(300)]],
projectDescription: [data?data.projectDescription:'', [Validators.required, Validators.maxLength(300)]],
funding: //See that I change your formBuilder to return
//an array, this is because when create the array don't enclosed
// by [ ]
this.formBuilder.array(this._buildFundingItems(data?data.items:null)),
});
}
//see that I was to return an array of FormGroup
_buildFundingItems(items:any[]|null):FormGroup[]
{
return items?items.map(x=>{
return this.formBuilder.group({
items: [x.items, [Validators.required, Validators.pattern(this.regexValidation.shortWordRegex)]]
amount: [x.amount, [Validators.required, Validators.pattern(this.regexValidation.amountTypeRegex)]]
}):
this.formBuilder.group({
items: ['', [Validators.required, Validators.pattern(this.regexValidation.shortWordRegex)]],,
amount: ['', [Validators.required, Validators.pattern(this.regexValidation.amountTypeRegex)]],
});
}
Вы видите, что вызываете функцию createForm, отправляющую данные: this.createForm(data), создайте форму с датой. Если вы вызываете функцию отправки null: this.createForm(null) создайте форму empy
Попробуйте что-то вроде этого:
this.form = this.formBuilder.group({
projectTitle: ['', [Validators.required, Validators.maxLength(300)]],
projectDescription: ['', [Validators.required, Validators.maxLength(300)]],
funding: this.formBuilder.array([this._buildFundingItems({ items: null, amount: null })]),
});
_buildFundingItems(data): FormGroup {
if (!data) {
data = {
items: null,
amount: null
}
}
return this.formBuilder.group({
items: [data.items, [Validators.required, Validators.pattern(this.regexValidation.shortWordRegex)]],
amount: [data.amount, [Validators.required, Validators.pattern(this.regexValidation.amountTypeRegex)]],
})
}
Я столкнулся с той же проблемой. Попробуйте такого рода вещи, создав formBuilder
группа для каждого ряда:
let employeeFormGroups = team.employees.map(employee => this.formBuilder.group(employee));
let employeeFormArray = this.formBuilder.array(employeeFormGroups);
this.teamForm.setControl('employees', employeeFormArray);
Для получения дополнительной помощи, вы можете обратиться по этой ссылке: https://www.concretepage.com/angular-2/angular-2-4-formbuilder-example