【问题标题】:Reactive forms conditional custom validation反应式表单条件自定义验证
【发布时间】:2020-02-17 13:03:45
【问题描述】:

我在 Angular 中使用反应式表单验证,我正在尝试为不同的用户添加不同的消息
无效,例如,如果我有一个应该在 1-100 之间的分数字段,我希望在用户输入一个字母时有一条消息,如果他输入一个大于 100 的数字,我希望有一条不同的消息。

有没有办法通过创建接口来做到这一点:

interface error {
     condition: boolean,
     message: string
}

使用 ngFor 并遍历一组错误,检查是否满足条件?

我遇到的问题是条件链接到 function() :布尔值,并且当用户输入无效输入时 ngFor 不会再次呈现自身,因为集合中没有变化,但条件的值函数将返回。

【问题讨论】:

标签: angular validation angular-reactive-forms ngfor angular-forms


【解决方案1】:

当您创建 customValidator 时,如果发生错误,您将返回一个对象。根据您的要求,此对象可以不同。

  customError() {
    return (control: AbstractControl) => {
      if (isNaN(control.value)) return { error: "it's not a number" };
      if (+control.value > 100) return { error: "it's greater than 100" };
      return null;
    };
  }

   <div *ngIf="myform.get('control').errors">
         {{myform.get('control').errors.error}}
   </div>

您还可以返回具有不同属性的对象,例如errorNaN 和 errorGt

  customError() {
    return (control: AbstractControl) => {
      if (isNaN(control.value)) return { errorNaN : "it's not a number" };
      if (+control.value > 100) return { errorGt: "it's greater than 100" };
      return null;
    };
  }

   <div *ngIf="myform.get('control').errors?.errorNaN">
      It's not a number
   </div>
   <div *ngIf="myform.get('control').errors?.errorGt">
      it's greater than 100
   </div>

一个简单的例子stackblitz

【讨论】:

  • Ben,第一个示例只显示唯一的错误消息,并且您有一个唯一的 div。定义的 customError 只会给你一个唯一的错误
  • 但是有没有办法遍历所有现有的错误,而不是手动为每个错误创建 div,而是类似:。
    {{error.message}}
  • 错误是一个对象,所以你需要使用KeyValuePipe angular.io/api/common/KeyValuePipe,有些像&lt;div *ngFor="let error of myform.get('control').errors | keyvalue"&gt;{{error.key}}:{{error.value}}&lt;/div&gt;
猜你喜欢
  • 2020-01-13
  • 2020-04-06
  • 2021-11-01
  • 2019-07-09
  • 1970-01-01
  • 2019-03-08
  • 2021-02-08
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多