Пользовательские валидаторы реактивной формы не отображают ошибку в angular6

В этой демонстрации я создал образец формы для настраиваемого валидатора, здесь у меня есть From date и TO date и from time и To time, работает нормально: для from date и to date проверка работает нормально и показывает сообщения об ошибках.

проблема: при выборе той же даты, например, 21 июля 2018 года с даты и того же в To dat e и In с 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 };
      }
    }
  }
}

живая демонстрация


person Mohamed Sahir    schedule 20.07.2018    source источник
comment
' InValidToTime': удалите этот начальный пробел. Могут быть и другие проблемы, но на этом я перестал читать.   -  person JB Nizet    schedule 20.07.2018
comment
@JBNizet, это опечатка при вставке, я думаю, что это проблема реализации при ошибке возврата, если вы хотите посмотреть демонстрацию, см. Здесьhttps://stackblitz.com/edit/angular-customvalidator?file=app%2Fdatepicker-overview-example.html   -  person Mohamed Sahir    schedule 21.07.2018


Ответы (1)


Это потому, что вы устанавливаете ошибки в своей форме, в то время как ожидаете, что ошибка будет на конкретном вводе.

Переход на <mat-error *ngIf="DaterForm.hasError('InValidToTime')"> Устраняет проблему.

К вашему сведению, mat-error не предназначен для использования с <input matInput/>

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

person Antoniossss    schedule 20.07.2018
comment
@why ошибка, которая не работает при перемещении mat-error внутри mat-form-field <mat-form-field> <mat-error *ngIf="DaterForm.get('ToDate').hasError('requiredToDate')">Please provide a valid Todate</mat-error> при перемещении после поля mat-form, которое работает - person Mohamed Sahir; 21.07.2018
comment
comment
Это потому, что вы используете это неправильно. Он предназначен для отображения ошибок конкретного ввода. Ввод должен быть в состоянии ошибки (не иметь нулевых ошибок), иначе mat-error будет скрыта. Это не ngIf в управлении КОГДА отображается ошибка (внутри matInput), а в состоянии управления. Это разветвленный пример с принудительно исправленной проблемой, но это не то, как следует использовать mat-error. stackblitz.com/edit/angular-customvalidator- xksspd? file = app /. Вы можете прочитать документацию по Angular Material на примерах, чтобы узнать, как правильно обрабатывать и отображать ошибки ввода (с анимацией и т. Д.). - person Antoniossss; 21.07.2018