Angular 2 Forms-如何在包含对象数组的嵌套表单组上修补值
我有一个表单,可以添加/删除项目行。每当我想要编辑表单时,我都会运行一个异步调用来获取一些数据,然后相应地修补/设置表单控件的值。但是,当我使用Angular 2的Angular 2 Forms-如何在包含对象数组的嵌套表单组上修补值,angular,angular2-forms,Angular,Angular2 Forms,我有一个表单,可以添加/删除项目行。每当我想要编辑表单时,我都会运行一个异步调用来获取一些数据,然后相应地修补/设置表单控件的值。但是,当我使用Angular 2的patchValue函数时,所有项目都按预期工作,它只使用对象数组的第一个对象(而不是所有对象)来修补窗体组 例如,如果我的表单有3行行行项目,比如在发票中,则只填充第一行。谁能告诉我我做错了什么 下面是我的组件功能 constructor() { this.createCheckRequestForm(); } creat
patchValue
函数时,所有项目都按预期工作,它只使用对象数组的第一个对象(而不是所有对象)来修补窗体组
例如,如果我的表单有3行行行项目,比如在发票中,则只填充第一行。谁能告诉我我做错了什么
下面是我的组件功能
constructor() {
this.createCheckRequestForm();
}
createCheckRequestForm() {
this.createRequestForm = this._fb.group({
issued_date: [new Date().toISOString(), [<any>Validators.required]],
due_date: [new Date().toISOString(), [<any>Validators.required]],
invoice_number: ['', [<any>Validators.required]],
how_to_send: ['Mail', [<any>Validators.required]],
normal_processing: ['', []],
is_corporation: ['', []],
line_items: this._fb.array([this.initLineItem()])
});
}
/**
* Init the line item for the form builder
*/
initLineItem(options?) {
return this._fb.group({
description: ['', []],
coding: ['', []],
amount: ['', []],
line_item_types: [[], []]
});
}
populateFormWithRequest(requestId) {
this.formPopulationObs = this._checkRequests.getRequest(requestId).subscribe(requestData => {
// Iterate through the line items and patch them
let lineItems = [];
requestData.line_items.forEach((lineItem, index) => {
let lineItemTypes = [];
if(lineItem.line_item_types) {
lineItemTypes = lineItem.line_item_types;
}
// Separate key-store for the coding dropdown models
this.lineItemCodings[index] = lineItem.coding;
let lineItemObj = {
description: lineItem.description,
coding: lineItem.coding,
amount: lineItem.amount,
line_item_types: lineItemTypes,
}
lineItems.push(lineItemObj);
})
this.createRequestForm.patchValue({line_items: lineItems});
})
}
提前谢谢 好的,为了让它正常工作,我实际上已经将表单组数组元素推到已经存在的“line_items”控件上,然后修补这些值。以下是我更新的功能:
populateFormWithRequest(requestId) {
this.formPopulationObs = this._checkRequests.getRequest(requestId).subscribe(requestData => {
// Iterate through the line items and patch them
requestData.line_items.forEach((lineItem, index) => {
let lineItemTypes = [];
if(lineItem.line_item_types) {
lineItemTypes = lineItem.line_item_types;
}
// Create the item obj
let lineItemObj = {
description: lineItem.description,
coding: lineItem.coding,
amount: lineItem.amount,
line_item_types: lineItemTypes,
}
const control = <FormArray>this.createRequestForm.controls['line_items'];
control.push(this.initLineItem());
control.at(index).patchValue(lineItemObj);
});
})
}
populateFormWithRequest(requestId){
this.formPopulationObs=this.\u checkRequests.getRequest(requestId).subscribe(requestData=>{
//遍历行项目并修补它们
requestData.line_items.forEach((lineItem,index)=>{
让lineItemTypes=[];
if(行项目。行项目类型){
lineItemTypes=lineItem.line\u项目\u类型;
}
//创建项目obj
设lineItemObj={
说明:lineItem.description,
编码:lineItem.coding,
金额:lineItem.amount,
行项目类型:行项目类型,
}
const control=this.createRequestForm.controls['line_items'];
control.push(this.initLineItem());
控件.at(索引).patchValue(lineItemObj);
});
})
}
相同的结果,稍微容易一点-无需创建空项并覆盖它:
populateFormWithRequest(requestId){
this.formPopulationObs=this.\u checkRequests.getRequest(requestId).subscribe(requestData=>{
此.createRequestForm[“行项目”]=
requestData.line_items.forEach(itm=>(this.createRequestForm[“line_items”).push(this.createRequestForm.group(itm));
));
});
}
看看这个:。其中一些概念可能会对您有所帮助。根据@R.Richards推荐的问题/答案,您必须在FormArray中循环并单独修补每个项目。在参考该帖子中的示例后,我得到一个错误:'Property'at'不存在于'AbstractControl'类型上。有什么好处/好的,所以我消除了错误,但问题是我的代码似乎要修补表单中尚不存在的line\u项。默认情况下,表单只创建1个line\u项
,如果我尝试修补3个line\u项
,它只会得到第一个,因为我相信只有一个已实例化。
populateFormWithRequest(requestId) {
this.formPopulationObs = this._checkRequests.getRequest(requestId).subscribe(requestData => {
// Iterate through the line items and patch them
requestData.line_items.forEach((lineItem, index) => {
let lineItemTypes = [];
if(lineItem.line_item_types) {
lineItemTypes = lineItem.line_item_types;
}
// Create the item obj
let lineItemObj = {
description: lineItem.description,
coding: lineItem.coding,
amount: lineItem.amount,
line_item_types: lineItemTypes,
}
const control = <FormArray>this.createRequestForm.controls['line_items'];
control.push(this.initLineItem());
control.at(index).patchValue(lineItemObj);
});
})
}