是否在FormControl上调用updateValueAndValidity()会触发Angular的更改检测

时间:2019-07-25 13:23:19

标签: angular angular-forms angular-changedetection

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

例如:

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

此触发器更改检测两次吗?

一次致电ChangeDetectorRef.detectChanges()更有效率吗?

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

1 个答案:

答案 0 :(得分:1)

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

a.value, etc..

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

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

然后我在该区域内向ngDoCheck() { console.log('checking for ', ++this.timesChecked); } 跑了两次,发现Angular变化检测只触发了一次。即使我设置了updateValueAndValidity(),它仍然只触发了一次。

总而言之,似乎您需要触发所有FormControl的更改检测,这足以在一个表单控件上调用{onlySelf: true, emitEvent: false}或一次调用updateValueAndValidity(),因为两者最终都触发了完整的更改检测循环。