【问题标题】:Angular(2/4/5/6) Custom validator error message not showingAngular(2/4/5/6)自定义验证器错误消息未显示
【发布时间】:2019-02-13 09:56:17
【问题描述】:

我正在尝试使用表单自定义验证器正确显示我的验证器,但我不知道如何调用它。我在 html 端尝试了 BroadcastForm.controls.errors.customTimeValidator() 但它不能正常工作。感谢您的帮助!

broadcast.component.ts

ngOnInit() {
    this.BroadcastForm = this.fb.group({
        datetime: [
            datetime,
            Validators.compose([Validators.required, this.customTimeValidator()]),
        ],
    });
}

customTimeValidator(): ValidatorFn {
    return (control: AbstractControl): { [key: string]: any } | null => {
        const minDate = new Date();
        minDate.setSeconds(0);
        this.minTime = minDate.getTime() + 59 * 1000;
        const forbidden = control.value <= minDate;
        return forbidden ? { forbiddenName: { value: control.value } } : null;
};
}

broadcast.component.html

<div class="validation-error" *ngIf="
   BroadcastForm.controls.datetimeOption.value === 'false' &&
   BroadcastForm.controls.errors.customTimeValidator()"> //how do I call customTimeValidator correctly?
   Please select a future date/time
 </div>

【问题讨论】:

    标签: angular forms validation


    【解决方案1】:

    改变这个

    BroadcastForm.controls.errors.customTimeValidator()

    BroadcastForm.controls['datetime']['errors']['forbiddenName']

    其实你可以使用json管道找到所有的错误

    {{ BroadcastForm.controls['datetime']['errors'] | json }}

    【讨论】:

      【解决方案2】:

      很抱歉,接受的答案令人作呕,无论是查看还是使用。

      使用更简单、更干净、有文档的东西:

      BroadcastForm.get('datetime').hasError('forbiddenName')
      

      【讨论】:

      • HasError 仅返回不显示错误详细信息的布尔值。对于多级表单数组或表单组,更容易循环遍历字段和级别。 fieldname.errors.validatorfn 也用于 Angular 网站 (angular.io/guide/form-validation)
      • @hugomac 您在哪里看到代码中使用的错误值?他要求用一种方式来展示它,暗示这个条件没有得到尊重。这里也没有多级,即使使用多级,您仍然可以非常简单地得到错误。至于文档,它们使用不同的 syntax,它比数组表示法更简洁。最后,我并不是说你错了,我是说你使用的语法很丑,不适合他的情况。
      • 哦。在他的例子中,其中有一个错误值可能想向用户显示。了解整个表单对象对于编写自己的 api 和库很重要。我想说 hasError() 只是 Angular 团队提供的一个 API。在某些情况下,甚至 hasError() 也可能返回错误值(您可以谷歌搜索)。使用默认 API 是干净的,但可能并非始终是最好的方法。变通。使用类似数组的格式是为了在遍历字段名称时动态使用,这是一种现实生活中的方法。无论如何,这是我的意见,在这里讨论这个可能不健康。很抱歉。
      • 是的,但在这种情况下不是。你用上下文和给定的代码回答一个问题:如果你想做一门课程,it's over there!它适用于 Angular 计划的任何情况。大多数情况下,它“不起作用”是在异步验证器期间,状态为“待定”,即既不有效也不无效。是的,这是你的意见,你完全有权这样做,我尊重这一点。但我也有我的!没问题,我们正在谈论,不要为为自己辩护而道歉:)
      猜你喜欢
      • 2023-03-11
      • 2018-08-09
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 2018-02-08
      • 2014-08-08
      • 1970-01-01
      • 2017-01-06
      相关资源
      最近更新 更多