angular - 如何在提交之前强制表单验证?

标签 angular typescript angular-reactive-forms

我需要确保表单中的每个验证仅在用户输入值并聚焦时才会触发。当输入值并且用户按回车键时,这会导致问题。即使值无效(但值为空),也会提交表单。

也许一个例子对于这种情况会更有帮助。

这是组件类:

readonly formGroup: FormGroup;

private constructor() {
  this.formGroup = new FormGroup(
    {
      firstControl: new FormControl(null),
      secondControl: new FormControl(null, Validators.minLength(4))
    },
    { updateOn: "blur" }
  );
}

onSubmit() {
  if (this.formGroup.valid) {
    // some logic here
  }
}

和 HTML 结构:

<form [formGroup]="formGroup" (ngSubmit)="onSubmit()">
  <label>First control</label>
  <input formControlName="firstControl" />
  <br />
  <label>Second control</label>
  <input formControlName="secondControl" />
  <br />
  <button>Submit</button>
</form>

在此示例中,当输入值 abc 并在第二个控件上按 enter 键时,表单将被提交。

附注我找到了一种解决方案,可以在 onSubmit() 函数中的 if 语句之前添加 document.activeElement.blur() 。这个解决方案在我的项目中是 Not Acceptable 。

最佳答案

如果表单无效,您可以通过调用 FormGroup.markAllAsTouched 方法来实现此目的。 如果您想强制验证表单组,可以在检查 valid 属性之前调用 FormGroup.updateValueAndValidity,如下所示:

onSubmit() {
  this._updateValueAndValidity();

  if (this.formGroup.invalid) {
    this.formGroup.markAllAsTouched(); // will set all the controls as touched 
  } else {
    // some logic here
  }
}

/** Update the value of form-group and validity of it and its descendants */
private _updateValueAndValidity() {
    for (let controlName in this.formGroup.controls) {
        this.formGroup.controls[controlName].updateValueAndValidity();
    }
}

关于angular - 如何在提交之前强制表单验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68985260/

相关文章:

angular - 在页面加载 Angular 2 上打开引导模式

JSON 中的 Angular 7 动态 react 表单如何自定义对齐字段

选中复选框时,Angular react 形式禁用输入

angular - 剑道 : Insert a FormGroup at a top into a FormArray

javascript - Angular 6 服务和类继承

javascript - ionic 日期时间 : Button for multiple ion-datetime created dynamically

angular - 错误 : No provider for HttpHandler in angular2

javascript - 从 firebase 返回的对象访问 $key

typescript - 无法使 tslint 与 Sublime Text 3 一起工作

angular - 可观察值是另一个可观察值的一部分