Я оставляю в stackblitz самый простой пользовательский элемент управления формы, основанный на вводе материала.
Как вы видите, реализует ControlValueAccessor, который имеет функции:
onChange:any; //declare this function to indicate in any time that you change the value
onTouched:any; //declare this function to indicate in any time that your compoment is touched
writeValue(value: any[]|any): void {
this.value=value;
}
registerOnChange(fn: any): void {
this.onChange = fn;
}
registerOnTouched(fn: any): void {
this.onTouched = fn;
}
setDisabledState(isDisabled: boolean): void {
this.disabled=isDisabled
}
И такой провайдер, как
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CustomMat),
multi: true
}
Если вы хотите выполнить проверку внутри компонента, вам нужно добавить нового поставщика
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CustomMat),
multi: true,
}
И создать функцию проверки
validate(control: AbstractControl): ValidationErrors | null{
//your logic here
return null;
}
Я использовал еще две функции:
setValue(value: any){
this.value=value;
this.onChange(value);
}
focusOut()
{
this.onTouched()
}
Для вызова изменения и прикосновения к функциям