代码之家  ›  专栏  ›  技术社区  ›  Mohamed Sahir

反应式表单自定义验证器在angular6中不显示错误

  •  1
  • Mohamed Sahir  · 技术社区  · 7 年前

    在这个演示中,我为自定义验证器创建了一个示例表单, 我有一个又一个的日期,一个又一个的时间, 工作正常: 对于“开始日期”和“结束日期”验证,工作正常并显示错误消息。

    问题: 什么时候 选择同一日期,例如)2018年7月21日为起始日期,同一日期为截止日期 E和In 从凌晨4点到凌晨3点, 条件得到满足,但没有显示错误消息。有些在实现中出错了,有人能帮助我解决吗

    在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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Antoniossss    7 年前

    因为你在你的 形式 而您希望错误出现在特定的输入上。

    更改为 <mat-error *ngIf="DaterForm.hasError('InValidToTime')"> 解决了这个问题。

    仅供参考 mat-error 设计用于 <input matInput/>

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

    推荐文章