【问题标题】:reactive form custom validators not displaying the error in angular6反应形式自定义验证器未在 angular6 中显示错误
【发布时间】:2018-12-29 03:41:19
【问题描述】:

在这个演示中,我为自定义验证器创建了一个示例表单, 在这里,我有 From date 和 TO date 以及 from time 和 To time, 工作正常: 对于从日期到日期的验证工作正常并显示错误消息。

问题: 当选择相同的日期,例如)2018 年 7 月 21 日作为起始日期,并且在 To dat 和 In from Time 是 4:00 Am 和 To Time 是 3:00 AM,条件得到满足,但没有显示错误消息。在执行中出现了一些错误,任何人都可以帮我解决感激之情

在 html 中,我给出了验证消息,但没有显示出来。

To Time:
<input type="time" formControlName="ToTime">
    <mat-error *ngIf="DaterForm.get('ToTime').hasError('InValidToTime')">FromTime Should be less than ToTime if choose a same date</mat-error>

在组件中:

 DaterForm : FormGroup;

constructor(private fb:FormBuilder){
}
   ngOnInit(){

 this.DaterForm = this.fb.group(
{
  FromDate:['',[AppCustomDirective.fromDateValidator]], // validation working fine
  FromTime:[''],
  ToDate:['',[AppCustomDirective.ToDateValidator]],// validation working fine
  ToTime:['']
},{validator:[AppCustomDirective.timeValidator] // validation not working
}

自定义验证:

import { AbstractControl, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms';

export class AppCustomDirective extends Validators{

   static fromDateValidator(fdValue: FormControl) {
    const date = fdValue.value;
    console.log('x');
    if (date ===null || date==='') return { requiredFromDate: true };

  }

   static ToDateValidator(todValue: FormControl) {
    const date = todValue.value;

    if (date ===null || date==='') return { requiredToDate: true };

  }


  static timeValidator(formGroupValues: FormGroup): any {
    debugger;
    console.log(formGroupValues);
    const FromDate = formGroupValues.get('FromDate').value;
    const ToDate = formGroupValues.get('ToDate').value;
    const FromTime = formGroupValues.get('FromTime').value;
    const ToTime = formGroupValues.get('ToTime').value;

    if (FromDate.toString() === ToDate.toString()) {
      let fromTime = [];
      let toTime = [];
      fromTime = FromTime.split(':');
      toTime = ToTime.split(':');
      if (parseInt(fromTime[0]) > parseInt(toTime[0])){
      alert("condition satisfied not return any error message");
         return { InValidToTime: true };
        }
      else if (
        parseInt(fromTime[0]) === parseInt(toTime[0]) &&
        parseInt(fromTime[1]) > parseInt(toTime[1])
      ){  alert("condition satisfied not return any error message")
        return { InValidToTime: true };
      }
    }
  }
}

live demo

【问题讨论】:

  • ' InValidToTime':删除这个前导空格。可能还有其他问题,但我当时就停止阅读了。
  • @JBNizet 粘贴时是拼写错误,我认为这是返回错误时的实现问题,如果您想查看演示,请参见此处https://stackblitz.com/edit/angular-customvalidator?file=app%2Fdatepicker-overview-example.html

标签: angular angular2-forms angular6 angular-reactive-forms angular4-forms


【解决方案1】:

这是因为您在 表单 上设置错误,而您希望错误出现在特定输入上。

更改为 &lt;mat-error *ngIf="DaterForm.hasError('InValidToTime')"&gt; 修复了问题。

仅供参考,这不是 mat-error 设计为与 &lt;input matInput/&gt; 一起使用的方式

https://stackblitz.com/edit/angular-customvalidator-1fu5vx?file=app/datepicker-overview-example.html

【讨论】:

  • @why 错误,当移动 mat-form-field &lt;mat-form-field&gt; &lt;mat-error *ngIf="DaterForm.get('ToDate').hasError('requiredToDate')"&gt;Please provide a valid Todate&lt;/mat-error&gt; 内的 mat-error 时,当在 mat-form 字段后移动时不起作用
  • 这是因为你用错了。它旨在显示特定输入的错误。输入必须处于错误状态(没有空错误),否则 mat-error 将被隐藏。它不是显示 WHEN 错误控制中的 ngIf(在 matInput 内部),而是控制状态。这是强制“修复”问题的分叉示例,但这不是 mat-error 应该如何使用。 stackblitz.com/edit/angular-customvalidator-xksspd?file=app/… 。您可以阅读有关示例的 Angular Material 文档,以了解如何正确处理和显示输入错误(使用动画等)。
猜你喜欢
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2019-07-26
相关资源
最近更新 更多