【问题标题】:Angular cross field validation and custom validation togetherAngular 跨字段验证和自定义验证一起使用
【发布时间】:2020-08-24 14:36:06
【问题描述】:

我有 7 天的开放、关闭字段。 open 和 close 参数可以有 hh:mm 或单词“Closed”。因此,每个打开和关闭字段都有正则表达式验证以匹配 hh:mm 或“关闭”字。此外,我正在尝试添加额外的跨字段验证,以确保一天中的一个字段不会被关闭。如果两者都关闭,则可以,但不是其中之一。

如果我有任何一个验证,代码似乎工作,但如果我有他们两个,它不工作。我尝试将示例代码放在 stackblitz 中。

https://stackblitz.com/angular/qvjapnglrrp

正则表达式验证

validateInput(c: FormControl) {
    const hourMinpattern = /^([0-1][0-9]|[2][0-3]):([0-5][0-9])$/;
    const closedPattern = /^Closed$/;
    return hourMinpattern.test(c.value) || closedPattern.test(c.value)
      ? null
      : {
          validateInput: {
            valid: false
          }
        };
  }

跨域验证

mondayOpenCloseValidator(formGroup: FormGroup): ValidationErrors | null {
    const open = formGroup.get("mondayOpen");
    const close = formGroup.get("mondayClose");

    if (
      (open.value === "Closed" || close.value === "Closed") &&
      open.value !== close.value
    ) {
      close.setErrors({ badState: true });
      close.markAllAsTouched();
      return { badState: true };
    }

    close.setErrors(null);                
    return null;
  }

表单生成器

this.editForm = this.formBuilder.group(
  {
    mondayOpen: new FormControl({ value: "", disabled: false }, [
      Validators.required,
      this.validateInput
    ]),
    mondayClose: new FormControl({ value: "", disabled: false }, [
      Validators.required,
      this.validateInput
    ]),
    tuesdayOpen: new FormControl({ value: "", disabled: false }, [
      Validators.required,
      this.validateInput
    ]),
    tuesdayClose: new FormControl({ value: "", disabled: false }, [
      Validators.required,
      this.validateInput
    ])
  },
  {
    validator: [
      this.mondayOpenCloseValidator,
      this.tuesdayOpenCloseValidator
    ]
  }
);

【问题讨论】:

    标签: angular angular-material angular-reactive-forms


    【解决方案1】:

    我认为您的问题在于自定义验证器 - 在验证结束时,您会删除所有错误,包括其他验证器的错误 -

    删除这一行:

    close.setErrors(null);
    

    因此生成的代码将如下所示:

    ondayOpenCloseValidator(formGroup: FormGroup): ValidationErrors | null {
        const open = formGroup.get("mondayOpen");
        const close = formGroup.get("mondayClose");
    
        if (
          (open.value === "Closed" || close.value === "Closed") &&
          open.value !== close.value
        ) {
          close.setErrors({ badState: true });
          close.markAllAsTouched();
          return { badState: true };
        }
                
        return null;
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-06
      • 2023-04-03
      • 2016-10-02
      • 1970-01-01
      • 2023-04-09
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多