【问题标题】:Trigger async validator only on blur仅在模糊时触发异步验证器
【发布时间】:2019-02-27 17:37:41
【问题描述】:

我有一个<input>,其中包含一个电话号码。电话号码在服务器端进行验证(大量业务逻辑)。

我创建了一个异步验证器PhoneNumberValidator。当它调用服务器时,我希望仅在用户离开字段(模糊)时触发验证。

FormControl 构造函数包含 3 个参数:

constructor(
  formState?: any, 
  validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null, 
  asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null
);
  1. 初始值
  2. 验证器或验证器数组或AbstractControlOptions 或 null
  3. 异步验证器或异步验证器数组或 null

因此,对于简单的验证器,可以传递一个 AbstractControlOptions,其中包含选项 updateOn,这正是我想要的。

为什么异步验证器没有这样的选项?还有其他方法吗?

【问题讨论】:

  • 你试过了吗?我在一个字段上使用了updateOn,其中包括同步和异步验证器。或者你的意思是你想要它在异步验证器上,而不是同步?
  • @AJT_82 如果我将{updateOn: 'blur'} 作为第二个参数,则永远不会调用异步验证器。此字段上没有其他验证器。另外,我检查了(blur) 事件是否适用于该字段(基本的<input matInput>
  • 如果您没有同步验证器,则只需为该部分设置一个空数组:)
  • @AJT_82 问题是我试图将验证器作为 FormControl 的第三个参数传递,而不是在 AbstractControlOptions 中传递它。谢谢:)

标签: angular


【解决方案1】:

我通过在 FormGroup 上定义 FormControl 来做到这一点:

{
  controlName: new FormControl({
    validators: [ Validators.required, etc ]
    asyncValidators: yourValidatorFunction(),
    updateOn: 'blur',
  }),
}

【讨论】:

  • 感谢您的示例,我理解了我的错误。如果使用AbstractControlOptions,那么异步验证器也必须在AbstractControlOptions 中传递,而不是作为FormControl csontructor 的第三个参数。这现在就像一个魅力。
  • 总是乐于提供帮助。
猜你喜欢
  • 1970-01-01
  • 2020-08-22
  • 2020-11-10
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多