首页 文章

Angular 2 Forms - 如何在包含对象数组的嵌套Form组上进行patchValue

提问于
浏览
3

在函数中,它只使用对象数组的第一个对象而不是所有对象来修补表单组 .

因此,例如,如果我的表单有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});
  })
}

如果我有这样的数组,只有第一个元素出现在“补丁”中

[ 
 {amount: "600", coding: "-Kfxw732pfWUS5rU0TRu", description: "Cameras"},
 {amount: "600", coding: "-Kfxw732pfWUS5rU0TRu", description: "Lights"}
]

提前致谢!

2 回答

  • 3

    好吧,所以为了让它工作,我实际上将表单组数组元素推送到已经存在的“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);
          });
      })
    }
    
  • 0

    相同的结果,更容易一点 - 没有创建一个空项并覆盖它:

    populateFormWithRequest(requestId) { 
      this.formPopulationObs = this._checkRequests.getRequest(requestId).subscribe(requestData => { 
        this.createRequestForm["line_items"] = 
    
    requestData.line_items.forEach(itm=>(<FormArray>this.createRequestForm["line_items"]).push(this.createRequestForm.group(itm)));
    
    )); 
    }); 
    }
    

相关问题