Angular 多次调用验证器函数

Angular Validator function called multiple times

我在项目中使用 Reactive 表单,我对表单组验证器有这种奇怪的行为。 我做了一个示例来向您展示问题

export class AppComponent {
  detailsForm: any;
  constructor(private formBuilder: FormBuilder) {
    this.detailsForm = this.formBuilder.group({
      firstName: ['', Validators.required],
      lastName: ['', Validators.required]
    }, { validator: [this.ValidForm] });
  }
  ValidForm = (formGroup: AbstractControl) => {
    console.log('hello');
  }
}

<form [formGroup]="detailsForm" action="" id="maforme">
  <input type="text" formControlName="firstName">
  <input type="text" formControlName="lastName">
  <button type="button">Save</button>
</form>

输出为

hello app.component.ts:18
hello app.component.ts:18
hello app.component.ts:18
hello app.component.ts:18

我的问题是为什么在这种情况下验证器被调用了 4 次?

我认为,您需要在此行中将 AbstractControl 替换为 FormGroup - ValidForm = (formGroup: AbstractControl)。

每次在 UI 上呈现控件时,验证器都是 运行,当它作为验证器应用到 f​​ormGroup 上时,验证器是一次。您可以通过删除 UI.

上的控件来验证这一点

我使用了您的示例,发现当应用程序加载时,会调用验证程序:

  • 控件中的FormGroup
  • html
  • 中的表单组
  • html
  • 中的表单控件
  • html
  • 中的表单控件

您可以通过在表单中​​注释掉整个 html 来重现此内容,然后将其部分返回并查看过程中的结果。

我认为这是错误的行为,但 Angular 是这样工作的。我用 7.1.0 版本测试过。