У меня есть настраиваемый компонент, наследующий ControlValueAccessor в моем приложении, который интегрирует ng-select а>
Цель этого компонента - иметь одно центральное место, где интегрирован ng-select, чтобы я мог повторно использовать его во всем приложении.
Вот как я называю метод проверки:
constructor(
@Optional() @Self() public controlDir: NgControl
) {
controlDir.valueAccessor = this;
}
ngOnInit() {
const control = this.controlDir.control;
if (control.validator) {
control.setValidators([this.validate.bind(this, [control.validator])]);
}
control.updateValueAndValidity({ emitEvent: false });
}
validate(validators: ValidatorFn[], c: FormControl) {
const allErrors: any = {};
for (const validator of validators) {
const hasError = validator(c);
if (hasError) {
Object.entries(hasError).forEach(([errorName, isOnError]) => {
allErrors[errorName] = isOnError;
});
}
}
if (Object.keys(allErrors).length > 0) {
return allErrors;
}
return null;
}
И вот как я обычно создаю экземпляр formControl в родительском компоненте:
const control = this.formBuilder.control(['[email protected]'], [Validators.email]);
this.form = this.formBuilder.group({ test: control });
Я хочу дать родителю возможность использовать встроенные валидаторы angular в моем пользовательском компоненте. (обязательно, электронная почта, минимум, максимум ...).
Проблема в том, что контрольное значение моего пользовательского компонента представляет собой массив строк, например, значение будет:
[ '[email protected]', '[email protected]' ]
компонент выглядит так
Проблема: в моей функции проверки у меня есть доступ к ValidatorFn, который проверяет, является ли мой элемент управления действительным адресом электронной почты. если бы моим контрольным значением была строка, она работала бы так, как ожидалось, но это массив строк, поэтому он не работает.
Итак, я предполагаю, что мне нужно повторно реализовать валидатор электронной почты для моего пользовательского компонента (поскольку имеет смысл, что angular не может волшебным образом определить структуру моих данных в моем пользовательском компоненте).
Но я не могу понять, как определить, что валидатор определен как Validator.email
.
this.controlDir.control.validator
- это функция, и я понятия не имею, как определить, что это валидатор электронной почты, чтобы я мог добавить свою собственную проверку для электронной почты.
Вопрос: как я могу узнать из моей пользовательской функции проверки, какой валидатор был установлен от родителя? Это Validators.required, Validators.email ... и т. Д.