【问题标题】:Pre Populate input field in `FormGroup` - Angular2预先填充“FormGroup”中的输入字段 - Angular2
【发布时间】:2017-09-12 22:05:15
【问题描述】:

我正在使用 Angular2 - 反应式表单。一切正常,直到我想在表单的一个字段中显示预填充的值。

场景:一个页面上有多个按钮,每个按钮打开一个表单,字段为

  1. 姓名
  2. 电子邮件
  3. 留言
  4. 产品代码 --> 应根据服务中的项目代码预先填充此值。

失败场景:产品代码输入值变为空。

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>

我怎样才能做到这一点?

【问题讨论】:

  • 请注意,您的问题提到您正在使用模板驱动的表单 - 但 FormGroup、FormBuilder 等适用于反应式表单 - 这意味着表单的创建和管理是由您的组件代码驱动的,而不是您的模板 - 那么您打算使用哪种方法:模板还是反应式?
  • 上面的问题可能看起来无关紧要,但除非你知道自己在做什么,否则混合这两种方法只会让你感到困惑
  • 糟糕.. 反应式表单

标签: angular angular2-template angular2-forms


【解决方案1】:

更新:我们发现,您需要一个 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.get('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.get('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>


原答案:

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

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

那么你不需要在你的表单中使用[value]="item.productCode",这个值是用表单控件设置的。

【讨论】:

  • 我需要在哪里订阅这个?
  • 嗯,这只是一个例子,你说你从服务中获取你的价值,所以当你收到item的价值时,然后使用patchValue来设置你得到的价值:)
  • 那么这个pcode会映射到我在页面上的每一个表单吗?
  • “我在页面上的每一个表单”,不知道你的意思??顺便说一句,通过演示更新了答案。
  • 表示服务返回一堆产品,每个产品对应一个产品有多种形式。因此,每个表单都应保存每个产品从服务返回的 pcode 值
猜你喜欢
  • 1970-01-01
  • 2017-07-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 2012-12-24
  • 2020-06-29
相关资源
最近更新 更多