当前位置: 首页 > 知识库问答 >
问题:

如何在自定义ControlValueAccessor中使用内置的角验证器

魏勇军
2023-03-14

我有一个自定义组件在我的应用程序上继承ControlValueAccessor,它集成了ng-select

这个组件的目标是有一个中心位置来集成ng-select,这样我就可以在整个应用程序中重用它。

这就是我调用验证方法的方式:

  constructor(
    @Optional() @Self() public controlDir: NgControl
  ) {
    controlDir.valueAccessor = this;
  }

  ngOnInit() {
    const control = this.controlDir.control;
    if (control.validator) {
      control.setValidators([this.validate.bind(this, [control.validator])]);
    }
    control.updateValueAndValidity({ emitEvent: false });
  }

  validate(validators: ValidatorFn[], c: FormControl) {
    const allErrors: any = {};
    for (const validator of validators) {
      const hasError = validator(c);
      if (hasError) {
        Object.entries(hasError).forEach(([errorName, isOnError]) => {
          allErrors[errorName] = isOnError;
        });
      }
    }

    if (Object.keys(allErrors).length > 0) {
      return allErrors;
    }

    return null;
  }

这就是我通常在父组件上实例化formControl的方式:

const control = this.formBuilder.control(['test@gmail.com'], [Validators.email]);

this.form = this.formBuilder.group({ test: control });

我想给父级一个选项,在我的自定义组件上使用内置的角度验证器。(必填项,电子邮件,最小值,最大值……)。

问题是,我的自定义组件的控件值是一个字符串数组,例如,该值将是:

[ 'test@gmail.com', 'jeff@gmail.com' ]

组件如下所示

问题:在我的validate函数中,我可以访问ValidatorFn,它将检查我的控件是否是有效的电子邮件。如果我的控件值是一个字符串,它会像预期的那样工作,但它是一个字符串数组,所以它不工作。

但是我不知道如何确定所定义的验证器是validator.email

this.controldir.control.validator是一个函数,我不知道如何识别它是电子邮件验证器,这样我就可以为电子邮件添加自定义验证了。

问题:我如何从我的自定义验证函数中知道哪个验证器是从父级设置的?是validators.required、validators.email...等等吗

共有1个答案

汝繁
2023-03-14

如何从我的自定义验证函数中知道哪个验证器是从父级设置的?

不幸的是,没有办法获得给定控件的验证器(详细信息)。

理论上,您可以迭代您的控件值(如果它是一个数组),并创建一个新的FormControl来验证数组中的每个字符串。

作为一个例子,您可以这样做:

isControlValid(controlValue: string[], validator: ValidatorFn) {
  let emailHasError = false;
  for (value of controlValue) {
    const ctrl = new FormControl(value, validator);
    if (Object.keys(validator(ctrl)).length) {
      emailHasError = true; // if any of the values are invalid
    }
  }
  return emailHasError; // or return whatever you need to.
}

也许像这样使用它

validate(validators: ValidatorFn[], c: FormControl) {
  const allErrors: any = {};
  for (const validator of validators) {
    if (Array.isArray(c.value)) {
      if (this.isControlValid(c.value, validator)) {
        // maybe update `allErrors` here or something

您可以随心所欲地实现它,但这个想法只是使用每个字符串自己的窗体控件来验证它。

使用ng_validators可能有一些晦涩难懂的方法以不同的方式实现这一点,但我没有研究过它。

 类似资料:
  • 问题内容: 我有其他人编写的REST api,其中处理请求到特定url的方法接受一堆从路径参数填充的参数。 撰写此文章的人曾经使用过DropWizard,但我以前没有使用它的经验。我的任务是通过将其与db中的值进行比较来验证studentId字段。这将非常简单,但是我被告知要使用自定义验证程序来执行此操作。我对编写注释非常陌生,但经过大量挖掘后,这样编写了注释, 此后,我将注释添加到了要像这样运行

  • 我正在构建一个Spring Boot应用程序,并试图为我将在服务层验证的一些DTO/实体实现自定义验证。基于Spring关于这个问题的文档,我认为一种方法是实现org。springframework。验证。验证程序界面。 作为一个最小、完整、可重复的示例,请考虑以下代码: Spring初始化引导项目 在src/main/java/com中添加了以下代码。实例使用验证: 如果我点击endpoint触

  • 我有一个表单,它要求两个字段中至少有一个字段具有值才能有效。现在,我已经构建了一个指令“KeywordandAuthor”来处理此验证。我已经成功地让它正确地检查任何一个字段是否有值,如果有,则将验证设置为true。我不确定如何将其他字段的验证设置为true。以下是指令的当前代码: 如何将siblingElem的有效性设置为true? **编辑** 这是我想要的工作解决方案。 要实现的关键点是,n

  • 我试图用Hibernate Validation 6.0.1定义约束定义,其中验证器位于相对于约束注释的不同位置(.jar/项目)。Aka,我有我想要验证的对象,它们位于带有注释定义的项目“api”中,但我将在项目“modules/common”中有验证器 我遵循文档中的描述。 配置文件 约束注释 验证器 我的问题我的问题是,如果我没有将“@约束(validatedby={})”放在注释中,我会得

  • 问题内容: 我正在使用带有自定义验证的Angular2的FormBuilder开发表单。问题:在customValidator中,我用来访问本地对象。执行验证时出现错误。 看起来customValidator是在其他对象中执行的,因此更改了引用 问题: 如何传递对customValidator 的引用? 问题答案: 使用箭头函数,以确保该函数绑定到此:

  • 我有一个名为的自定义验证器函数。 如果我像这样设置表单,一切都工作了: 但是,如果我使用这样的表单生成器设置表单: 如果构造函数中将定义为,则验证不起作用。所谓“不工作”,我的意思是表单的valid属性不正确,在控制台中我看不到预期的输出(使用第一个方法显示)。 我没有在第二个方法中正确定义验证器(如果是这样的话,应该如何定义它),或者FormBuilder有什么东西使自定义验证器不可用?