Несколько пользовательских валидаторов в реактивной форме угловой 2
У меня два кастома validator
в reactive form
Я вызываю функцию ниже, чтобы создать форму в конструкторе компонента:
private createForm(): void {
this.passwordUpdateForm = this.formBuilder.group({
newpassword : [null, Validators.required],
passwordconfirm: [null, Validators.required]
},
{
validator: [PasswordValidation.PasswordMatch, PasswordValidation.PasswordRule] // validation method
});
}
PasswordValidation - это класс с двумя функциями, как показано ниже
export class PasswordValidation {
public static PasswordMatch(control: AbstractControl) {
let password = control.get('newpassword'); // to get value in input tag
if(password){
let confirmPassword = control.get('passwordconfirm').value; // to get value in input tag
if (password.value !== confirmPassword) {
control.get('passwordconfirm').setErrors({ ['passwordmatch'] : true});
}else {
return null;
}
}
}
public static PasswordRule(control: AbstractControl) {
let password = control.get('newpassword').value; // to get value in input tag
let pattern = new RegExp('^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,64}');
if (!pattern.test(password)) {
control.get('newpassword').setErrors({ ['passwordrule'] : true});
}else if (password.toLowerCase() === 'something') {
control.get('newpassword').setErrors({ ['passwordrule'] : true});
}else {
return null;
}
}
}
каждый пользовательский валидатор работает нормально отдельно, как это
validator: PasswordValidation.PasswordMatch
или это
validator: PasswordValidation.PasswordRule
но используя их обоих в массиве, как
validator: [PasswordValidation.PasswordMatch, PasswordValidation.PasswordRule]
получить ошибку this.validator is not a function
и не работает, я понятия не имею, пожалуйста, помогите.
1 ответ
Лучше использовать Validators.compose([])
который принимает массив валидаторов для использования в конкретном пользовательском элементе управления в группе форм.
например, если вы хотите добавить валидаторы против passwordconfirm
а также newpassword
контролировать вы можете сделать это, как показано ниже
private createForm(): void {
this.passwordUpdateForm = this.formBuilder.group({
newpassword : [null, Validators.compose([Validators.required,PasswordValidation.PasswordRule])],
passwordconfirm: [null, Validators.compose([Validators.required, PasswordValidation.PasswordMatch])]
});
под капотом это то, что код выглядит
group(controlsConfig: {[key: string]: any}, extra: {[key: string]: any} = null): FormGroup {
const controls = this._reduceControls(controlsConfig);
const validator: ValidatorFn = isPresent(extra) ? extra['validator'] : null;
const asyncValidator: AsyncValidatorFn = isPresent(extra) ? extra['asyncValidator'] : null;
return new FormGroup(controls, validator, asyncValidator);
}
вы можете увидеть параматера validator
на самом деле тип интерфейса ValidatorFn
который выглядит как ниже
interface ValidatorFn {
(c: AbstractControl): ValidationErrors|null
}
так что вы можете видеть, что он может принимать любой метод, имеющий вышеуказанную подпись.
Источник: https://angular.io/api/forms/ValidatorFn
Проверьте эту ссылку для получения дополнительной информации: https://toddmotto.com/reactive-formgroup-validation-angular-2