Очевидно, вам просто нужно использовать updateValueAndValidity
в элементе управления формы, который был изменен.
this.form.get('profile').get('description').updateValueAndValidity();
В итоге это выглядит так:
public ngAfterViewInit() {
// Form controls will now exist
console.log('ngAfterViewInit', this.form.value);
// BUT the validators of the profile form should not allow submission if set to required, and they do?
this.form.get('profile').get('description').setValidators([Validators.required]);
this.form.get('profile').get('description').updateValueAndValidity();
}
Когда выСделав это, вы получите сообщение об ошибке в консоли:
ERROR
Error: ExpressionChangedAfterItHasBeenCheckedError:
Expression has changed after it was checked.
Previous value: 'ng-valid: true'. Current value: 'ng-valid: false'.
, которое можно преодолеть, используя ChangeDetectorRef
и вызывая this.changeDetector.detectChanges()
, или обновив стратегию обнаружения изменений родительского компонента, указав ChagneDetectionStrategy.OnPush
.
constructor(private changeDetector: ChangeDetectorRef) { }
// Removed for brevity
public ngAfterViewInit() {
const descControl = this.form.get('profile').get('description');
descControl.setValidators([Validators.required]);
descControl.updateValueAndValidity();
this.changeDetector.detectChanges();
}
@Component({
selector: 'app-page',
templateUrl: './page.component.html',
styleUrls: ['./page.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class PageComponent implements OnInit, AfterContentInit, AfterViewInit {
// Removed for brevity
public ngAfterViewInit() {
const descControl = this.form.get('profile').get('description');
descControl.setValidators([Validators.required]);
descControl.updateValueAndValidity();
}
}