Angular Validators.email允许null值

时间:2017-07-11 10:45:22

标签: angular typescript

我的.ts文件中有这个Angular验证器:

this.detailsForm = formBuilder.group(
            {

                email: ['', Validators.compose([Validators.email])]
            });

这很好但是当我应用电子邮件验证器时,它也会应用所需的验证器。我也想允许空值。我该怎么做?

2 个答案:

答案 0 :(得分:3)

这只是因为null /空值与预期形状(正则表达式)不匹配。

This是与Validators.email一起使用的当前正则表达式:

const EMAIL_REGEXP = /^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/;

console.log(EMAIL_REGEXP.test('')); // false
console.log(EMAIL_REGEXP.test(null)); // false
console.log(EMAIL_REGEXP.test('a@a.com')); // true

为了实现您的目标,您可以build a custom validator,接受此正则表达式或null /空值,或者如果我有此要求,我会做什么:an async validator如果Validators.email大于0,则在值中应用length

答案 1 :(得分:-1)

自定义验证器:

export function emailValidator(): ValidatorFn {
  return (control: AbstractControl): { [key: string]: any } => {
    // tslint:disable-next-line:max-line-length
    let regex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    const mail = control.value;
    const matches = regex.test(mail);
    // If value is null, let the required error handle it
    return !mail ? null : matches ? null : { 'mailPattern': { mail } };
  };
}