在 FormControl 上调用 updateValueAndValidity() 是否触发 Angular 的变化检测

Does calling updateValueAndValidity() on a FormControl trigger Angular's change detection

在 Angular FormControl 上调用 updateValueAndValidity() 时,是否会触发组件的 Angular 更改检测?

例如:

ngOnInit() {
    this.email.updateValueAndValidity();
    this.password.updateValueAndValidity();
}

这会触发变化检测两次吗?

调用一次ChangeDetectorRef.detectChanges()效率更高吗?

这是否取决于我将 emitEvent 参数设置为什么?

为了测试,我使用以下代码在 Angular 的更改检测之外更改了两个不同的 FormControl 值。

this.zone.runOutsideAngular(() => {
  this.email.setValue('test@email');
  this.password.setValue('test-password');
});

使用 ngDoCheck Lifecycle 挂钩,我能够计算变更检测的次数 运行。

ngDoCheck() {
    console.log('checking for ', ++this.timesChecked);
}

然后我 运行 updateValueAndValidity() 两次回到区域内,发现 Angular 变化检测只触发了一次。即使我设置 {onlySelf: true, emitEvent: false} 它仍然只触发一次。

总而言之,如果您需要触发所有 FormControl 的变化检测,那么在一个表单控件上调用 updateValueAndValidity() 或调用 ChangeDetectorRef.detectChanges() 一次就足够了,因为两者最终都会触发一个完整的更改检测周期。