Вызов updateValueAndValidity() в FormControl вызывает обнаружение изменений Angular

При вызове updateValueAndValidity() в Angular FormControl вызывает ли это обнаружение изменений Angular для компонента?

Например:

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

Будет ли это вызывать обнаружение изменений дважды?

Является ли более эффективным вызывать ChangeDetectorRef.detectChanges() один раз?

Зависит ли это от того, что я установил для аргумента emitEvent?


person Dovid Gefen    schedule 25.07.2019    source источник
comment
angular.io/api/forms/AbstractControl#updateValueAndValidity это должно ответить на ваш вопрос   -  person pjominet    schedule 25.07.2019


Ответы (1)


Для тестирования я использовал следующий код для изменения двух разных значений FormControl вне обнаружения изменений Angular.

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}, он все равно сработал только один раз.

В заключение кажется, что если вам нужно инициировать обнаружение изменений для всех FormControls, достаточно либо вызвать updateValueAndValidity() для одного элемента управления формы, либо вызвать ChangeDetectorRef.detectChanges() один раз, поскольку оба в конечном итоге запускают полный цикл обнаружения изменений.

person Dovid Gefen    schedule 29.07.2019