问题描述
我想通过对 2 个验证结果进行 ORing 来获取表单字段的验证结果
例如
this.registerForm = this.formBuilder.group({
username: ['',[Validators.required,Validators.pattern(USERNAME_REGEX) || Validators.email]],});
这样的事情有可能吗?
限制条件:用户名应该是电子邮件地址或者是与用户名正则表达式模式匹配的有效用户名
我想使用 angular 的内置电子邮件验证器的输出和自定义正则表达式模式的输出来识别该字段是否有效。
PS:我参考了这篇文章 -> Angular 2 combined form validation 但它不符合我的条件
解决方法
您需要编写自己的验证器函数。
private loginNameValidator = (): ValidatorFn => {
const userNameValidator = Validators.pattern(USERNAME_REGEX);
return (control: AbstractControl): ValidationErrors | null => {
const userNameInvalid = userNameValidator(control);
if (!userNameInvalid) {
return null;
}
const emailInvalid = Validators.email(control);
if (!emailInvalid) {
return null;
}
return { loginNameInvalid: true };
};
};
使用它
this.registerForm = this.formBuilder.group({
username: ['',[Validators.required,this.loginNameValidator()]],});
,
没有满足您要求的内置功能。
您必须为此实现自定义验证器。
public userNameOrEmailValidator(): ValidatorFn => {
return (control: AbstractControl): ValidationErrors | null => {
const userNameRegex = // TODO: define username regex here.
const emailRegex = // TODO: define email regex here.
const isValid = userNameRegex.test(control.value) || emailRegex .test(control.value);
return !isValid? {inValidUserName: true} : null;
};
}
这样称呼它:
this.registerForm = this.formBuilder.group({
username: ['',userNameOrEmailValidator()]],});