Как сделать собственный валидатор в Angular2
Я делаю специальный валидатор для проверки, является ли ввод действительным форматом электронной почты.
Это мой класс Validator:
import {FormControl} from "@angular/forms";
export class EmailValidator {
static getEmailValidator() {
return function emailValidator(control: FormControl): { [s: string]: boolean } {
if (!control.value.match(/^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/)) {
return {invalidChars: true};
}
}
}
}
Мой HTML выглядит так:
<div class="form-group">
<input class="form-control"
[(ngModel)]="model.email"
type="text"
id="name"
placeholder="Enter your email"
[formControl]="signupForm.controls['email']"
>
<div *ngIf="signupForm.controls['email'].errors?.required&& signupForm.controls['email'].touched"
class="alert alert-danger">Email is required</div>
<div *ngIf="signupForm.controls['email'].hasError('invalidChars') && signupForm.controls['email'].touched"
class="alert alert-danger">Please give a valid email address</div>
Мой компонент в HTML:
export class SignupComponent {
signupForm: FormGroup;
email: AbstractControl;
model: any = {};
response: any;
constructor(fb: FormBuilder, private userService: UserService) {
this.signupForm = fb.group({
'email' : ['', Validators.compose([Validators.required, EmailValidator.getEmailValidator()])]
});
this.email = this.signupForm.controls['email'];
}
И, наконец, исключение, которое я получаю:
Uncaught (in promise): Error: Error in ./SignupComponent class
SignupComponent - inline template:31:4 caused by: Cannot read property
'match' of undefined TypeError: Cannot read property 'match' of undefined at
emailValidator
У меня вопрос, почему мое совпадение не определено, и как было бы наиболее подходящим для реализации пользовательского валидатора?
1 ответ
Решение
Поскольку сам валидатор выглядит нормально, ошибка выглядит так же, как ваша control.value
является undefined
как это нетронутый. Обновить emailValidator
функция к следующему:
static getEmailValidator() {
return function emailValidator(control: FormControl): { [s: string]: boolean } {
if (control.value && !control.value.match(/^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/)) {
return {invalidChars: true};
}
}
Таким образом, он попытается проверить значение с помощью регулярного выражения только в том случае, если есть один предоставленный.