在 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()
一次就足够了,因为两者最终都会触发一个完整的更改检测周期。
在 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()
一次就足够了,因为两者最终都会触发一个完整的更改检测周期。