在 Angular 中组合 2 个验证器的结果ORing并将其用作单个验证因素

问题描述

我想通过对 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()]],});

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...