【问题标题】:How to Get Value and Do Validation of Input inside *ngFor Angular如何在 *ngFor Angular 中获取值并验证输入
【发布时间】:2020-06-06 07:06:57
【问题描述】:

我在ngFor 中有一个表单(多个输入字段),我想获取值并验证它们并将它们添加到用户数组以将其发送回 API。

  <form [formGroup]="registerForm" (ngSubmit)="onSubmit()">
    <div *ngFor="let user of users">
      <div class="form-group">
          <label>First Name</label>
          <input type="text" formControlName="firstName" class="form-control" [ngClass]="{ 'is-invalid': submitted && f.firstName.errors }" />
          <div *ngIf="submitted && f.firstName.errors" class="invalid-feedback">
              <div *ngIf="f.firstName.errors.required">First Name is required</div>
          </div>
      </div>
      <div class="form-group">
          <label>Last Name</label>
          <input type="text" formControlName="lastName" class="form-control" [ngClass]="{ 'is-invalid': submitted && f.lastName.errors }" />
          <div *ngIf="submitted && f.lastName.errors" class="invalid-feedback">
              <div *ngIf="f.lastName.errors.required">Last Name is required</div>
          </div>
      </div>
    </div>

    <div class="form-group">
        <button [disabled]="loading" class="btn btn-primary">Register</button>
    </div>
</form>

.ts

export class AppComponent  {
  users=[ 
    {id: 1},
    {id: 2},
    {id: 3}
  ]


  registerForm: FormGroup;
  submitted = false;
  constructor(private formBuilder: FormBuilder){
    this.registerForm = this.formBuilder.group({
      firstName: ['', Validators.required],
      lastName: ['', Validators.required]
    });
  }

  get f() { return this.registerForm.controls; };

  onSubmit() {
    this.submitted = true;
    // stop here if form is invalid
    if (this.registerForm.invalid) {
        return;
    }
    console.log(this.registerForm.value) // here i am getting value from last edited index.
  }
}

编辑: Stackblitz Exmple

【问题讨论】:

  • 您要根据用户数组创建表单吗?
  • 是的,我想在用户数组上创建表单。并将输入值添加到该数组,以便我可以发送到服务器。

标签: javascript angular forms validation angular-reactive-forms


【解决方案1】:

您必须使用 users 数组创建 FormGroup 数组。

试试这个:

component.ts

 this.registerForm = this.formBuilder.group({
      userDetails: this.formBuilder.array(this.users.map(item=>{
       return this.createItem(item) 
      })),
  });

由于 userDetails 控件是 formGroup 的数组,因此您不需要在 html 中使用 users 数组。

component.html

<form [formGroup]="registerForm" (ngSubmit)="onSubmit()">
    <div formArrayName="userDetails" *ngFor="let item of registerForm.get('userDetails').controls; let i = index;">
        <div [formGroupName]="i">
            <div class="form-group">
                <label>First Name</label>
                <input type="text" formControlName="firstName" class="form-control"  />
                <div *ngIf="submitted && registerForm.controls['userDetails'].invalid" class="invalid-feedback">
                    <div>First Name is required</div>
                </div>
            </div>
            <div class="form-group">
                <label>Last Name</label>
                <input type="text" formControlName="lastName" class="form-control"  />
                <div *ngIf="submitted && registerForm.controls['userDetails'].invalid" class="invalid-feedback">
                    <div>Last Name is required</div>
                </div>
            </div>
        </div>
    </div>
    <div class="form-group">
        <button [disabled]="loading" class="btn btn-primary">Register</button>
    </div>
</form>

Example

【讨论】:

  • FormGroup中不需要包含formArray,可以直接使用formArray
  • 是的,因为他已经将formarray从组中分组,我使用了类似的方法
【解决方案2】:

您不能对数组值使用简单的 FormControl。 formControl 仅适用于单个值,因此只会将最后编辑的值附加到它们,您需要使用 https://angular.io/api/forms/FormArray 为此

【讨论】:

  • 我该怎么做?这才是真正的问题。我已经尝试了很多例子,但没有一个对我有用。
  • 根据您的建议,我使用FormArray 进行了尝试,但它仍然只能获得最后编辑的值。 stackblitz.com/edit/angular-nxqbjq
  • 您需要在此处进行一些修改,首先删除用户 *ngFor 并仅保留 formArray ngFor 并第二次调用与您拥有的用户一样多的 createItems() ,每个用户需要一个 forrmGroup,第三次删除 formGroupName并添加 formGroup="item" (第三个选项是额外的,但无论如何你不需要索引)
猜你喜欢
  • 2020-11-02
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 2018-11-08
  • 2017-02-01
  • 1970-01-01
  • 2018-01-18
  • 2018-02-02
相关资源
最近更新 更多