【问题标题】:Angular Reactive forms - Create input fields dynamically and get fill inputs with idAngular Reactive forms - 动态创建输入字段并使用 id 获取填充输入
【发布时间】:2018-10-08 14:34:24
【问题描述】:

在 Angular Reactive 表单中 - 我有这样 3 项的数组:

productList = [{
  productId : "104",
  productName : computer
},
{
  productId : "105",
  productName : sprots
},
{
  productId : "106",
  productName : location
}]

这样声明表单组:

this.productFormGroup = this.formBuilder.group({
      productFormArray: new FormArray([], CustomValidators.minNumberInputFieldRequired(1)),
    });

像这样创建输入字段:

productList.forEach((element) => {
        productFormArray.push(new FormControl('', [Validators.pattern(ValidationPatterns.required)]));
      });

像这样绑定:

<div *ngFor="let item of formControls; let i = index">
    <input type="text" [formControlName]="i" class="form-control">
</div>

问题

我如何在提交按钮上获得 3 个文本框 更新值他们的 id

提交按钮事件:-

if (this.productFormGroup.invalid) {
  return;
}
this.productFormGroup.value.productFormArray ? - it is return only update value, not Id.

应该有办法在表单数组中推送项目时创建带有 id 的文本框

【问题讨论】:

    标签: angular angular5 angular6 angular-reactive-forms angular-forms


    【解决方案1】:

    您必须在 FormGroup 中创建 productId 和 productName 字段(FormControl)。在用户界面方面,仅将 productName 字段绑定为文本框,因为 productId 用于您的内部参考。请参见下面的代码示例: app.component.ts

    import { Component,OnInit } from '@angular/core';
    import { FormBuilder,FormGroup,FormArray } from '@angular/forms'
    
    
    @Component({
      selector: 'my-app',
      templateUrl: './app.component.html',
      styleUrls: [ './app.component.css' ]
    })
    export class AppComponent implements OnInit {
      name = 'Angular';
      productList = [{
        productId : "104",
        productName : "computer"
      },
      {
        productId : "105",
        productName : "sprots"
      },
      {
        productId : "106",
        productName : "location"
      }];
    
      constructor(public formBuilder:FormBuilder){
    
      }
    
    productFormGroup :FormArray
      ngOnInit() {
            this.productFormGroup = this.formBuilder.array([])
            this.productList.forEach(product=>{
                  this.productFormGroup.push(this.formBuilder.group({
                    productId:[product.productId],
                    productName:[product.productName]
                  }))
            })
      }
    
      onSubmit(){
      console.log(this.productFormGroup.value)
        
      }
    }
    

    在用户界面方面,在文本框字段上绑定产品名称。请看下面的代码示例:

    <div [formGroup]="product" *ngFor="let product of productFormGroup.controls">
        <input formControlName="productName" type="text" />
    </div>
    {{productFormGroup.value | json}}
    

    我希望这能解决您的问题。查看stackblitz上的工作代码示例

    【讨论】:

    • 实施此解决方案后,对于单选按钮更改事件,我需要重置表单。所以我这样做 > this.productFormGroup.reset();有了这个,隐藏的 productId 也为空,还有什么其他解决方案?
    • 您到底想达到什么,以便我可以帮助您。基本上,如果您没有传递对象,reset 函数将从表单控件中清除值。请分享更多信息...
    • 当我们将数据保存到数据库时,此解决方案将不起作用,我们正在清除我们的表单 (this.form.reset()) - 所以第二次我们将无法使用它。我们想使用productItem,其中productname可以与文本框绑定,并且在提交时我们应该能够获得我们获得productname值输入框的哪个productId,通过重置,文本框值应该是清晰的,但它不应该清除productId,基本上。
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多