Ты близко, и ты прав;синтаксис немного сбивает с толку.Ожидается, что пользовательский Validator
будет методом ValidatorFn
, который будет вызываться с параметром AbstractControl
.Например, вот очень простой валидатор:
public static numeric(control: AbstractControl): { [key: string]: any } {
return /^[0-9]+$/.test(control.value) ? null : { 'numeric': false };
}
// .. { category: [0, Validators.required, numeric] }
Мы просто передаем ссылку на метод в FormBuilder
, который он будет вызывать, передавая FormControl
, в котором он находится, для проверки значения.
Если вы хотите обернуть некоторые из ваших собственных параметров с помощью валидатора, просто создайте свою собственную область действия функции и верните новый метод:
public static checkCategoryInput(input: string, categoryList: any[]): ValidatorFn {
return (control: AbstractControl): { [key: string]: any } => {
const val = control.value;
return 'Do stuff with the value because `input` and `categoryList` are now in scope!'
}
}
Так же, как немного дополнительной информации, так как она такжене очень хорошо сказано нигде;возвращаемая подпись { [key: string]: boolean } | null
- это то, что будет помещено в свойство errors
ngControl
, поэтому обычно вы возвращаете null
, если оно действительно, и errorName: false
, если оно недействительно.Об этом следует помнить, если вы пытаетесь показать сообщения об ошибках, основанные на этом конкретном валидаторе.