我正在使用Angular2- react 形式。一切工作正常,直到我想在Form的一个字段中显示一个预填充的值。

方案:页面上有多个按钮,每个按钮打开一个表单,其中的字段为

  • 名称
  • 电子邮件
  • 消息
  • 产品代码->此值应根据服务中的项目代码预先填充。



  • TS代码:
    import { FormGroup, FormBuilder, Validators } from '@angular/forms';
    queryForm: FormGroup;
    constructor(private _productService: ProductService, fb: FormBuilder) {
        this.queryForm = fb.group({
            'name': [null, Validators.compose([Validators.required, Validators.minLength(5)])],
            'email': [
                null, [Validators.required, Validators.email]
            ],
            'message': [null,Validators.compose([Validators.required, Validators.minLength(5)])],
            'pcode': [
                null
            ],
        })
    }
    

    HTML表单:
    <div *ngFor="let item of product">
    <form action="#" [formGroup]="queryForm"
     (ngSubmit)="submitForm(queryForm.value)" method="post"
      novalidate="" class="text-left note" id="f_{{item.productId}}">
        [ .... rest of the fields ...]
        <div class="form-group hidden">
              <input type="hidden " class="form-control " id="pcode " name="pcode"
            formControlName="pcode" [value]="item.productCode" />
         </div>
         <div class="form-group">
               <button type="submit" class="btn1" [disabled]="!queryForm.valid">Submit</button>
          </div>
    </form>
    </div>
    

    我怎样才能做到这一点?

    最佳答案

    更新:我们发现,您需要的是formArray而不是单个formControl。因此,在构建表单时声明:

    this.queryForm = this.fb.group({
      arrayOfData: this.fb.array([]) // name a proper name to array
    })
    

    收到数据后,可以使用setValuepatchValue,在其中迭代响应并将值修补到表单数组中。在您的回调(订阅)中调用patchValues -method。

    patchValues() {
      const control = <FormArray>this.queryForm.controls.arrayOfData;
      this.items.forEach(x => {
        control.push(this.patchValue(x.first_name, x.pcode))
      })
    }
    
    patchValue(name, code) {
      return this.fb.group({
        name: [name],
        pcode: [code]
      })
    }
    

    在您的模板中,迭代formarray并记住要设置formgroupname(即索引):

    <div formArrayName="arrayOfData">
      <div *ngFor="let code of queryForm.controls.arrayOfData.controls; let i = index">
        <div formGroupName="{{i}}">
          <label>Name: </label>
          <input formControlName="name" /><br>
          <label>Product Code: </label>
          <input formControlName="pcode" /><br>
        </div>
      </div>
    </div>
    

    Demo

    原始答案:

    您应该始终在组件而不是模板中设置表单值。当您从服务接收到值时,可以使用patchValuesetValue ...这样,您可以在回调(订阅)内部执行此操作:

    this.myService.getSomeData()
      .subscribe(data => {
         this.item = data;
         this.queryForm.patchValue({pcode: this.item.productCode})
      });
    

    然后,您无需在表单中使用[value]="item.productCode",而是使用表单控件设置此值。

    Demo

    10-06 11:37