у вашего подхода есть несколько проблем;
прежде всего, вы реализуете ControlValueAccessor
, но ваш InputComponent
имеет @Input
с именем formControl.В результате этого, когда вы связываете form.controls.field
с app-input
, ваша форма не взаимодействует с ControlValueAccessor.
<app-input label="Test" hint="It is a test" [formControl]="form.controls.field" required></app-input>
Как указано в docs ;
ControlValueAccessor действует как мост между API угловых форм и собственным элементом в DOM (элемент ввода html)
Здесь возникает вторая проблема;в InputComponent
связь между DOM (элемент ввода html) и ControlValueAccessor
обрабатывается через ngModel
, который по сути является оберткой вокруг явно созданного FormControl
под капотом.
В результате этого;form.controls.field
FormControl не имеет связи с фактическим элементом ввода, ngModel имеет.Вот почему, когда вы вручную фокусируете / размытие входного элемента, он отображает состояние ошибки, но this.form.get('field').markAsTouched();
ничего не делает.
Третья проблема заключается в том, что;даже если вы заставляете ControlValueAccessor
работать, удаляя @Input formControl
из InputComponent
и взаимодействовать с html-вводом без ngModel
;тем не менее, mat-form-field
не сможет взаимодействовать (т.е. получать статус ошибки) с базовым элементом input
, поскольку требуется реализовать MatFormFieldControl
Четвертая проблема заключается в том, что при использовании ReactiveForms,проверки (например, необходимые в вашем случае) и отключенное состояние должны обрабатываться через FormControl неявным образом.
Хорошая новость заключается в том, что у всех этих проблем есть очень простое решение, которое без реализации ControlValueAccessor
просто передает formControl в InputComponent.и привязать его к вводу html.
Вот рабочий пример;https://stackblitz.com/edit/angular-fwdrv9
Надеюсь, это поможет, хорошего дня.