Angular 2 Forms-如何在包含对象数组的嵌套表单组上修补值

Angular 2 Forms-如何在包含对象数组的嵌套表单组上修补值,angular,angular2-forms,Angular,Angular2 Forms,我有一个表单,可以添加/删除项目行。每当我想要编辑表单时,我都会运行一个异步调用来获取一些数据,然后相应地修补/设置表单控件的值。但是,当我使用Angular 2的patchValue函数时,所有项目都按预期工作,它只使用对象数组的第一个对象(而不是所有对象)来修补窗体组 例如,如果我的表单有3行行行项目,比如在发票中,则只填充第一行。谁能告诉我我做错了什么 下面是我的组件功能 constructor() { this.createCheckRequestForm(); } creat

我有一个表单,可以添加/删除项目行。每当我想要编辑表单时,我都会运行一个异步调用来获取一些数据,然后相应地修补/设置表单控件的值。但是,当我使用Angular 2的
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);
      });
  })
}