Angular: mat-error 不适用于自定义验证器

Angular: mat-error is not working on custom validator

当 DatePicker 结束日期输入小于开始日期输入时,我无法正确实现 mat-error 样式更改。该按钮能够通过禁用自身来识别输入无效,但在 'end_date'.

上不会发生错误样式更改

代码:

    <mat-error *ngIf="userAddressValidations.hasError('validator')">
      End date must be greater than start date.
    </mat-error>

我的目标是在自定义验证器检测到错误时显示此错误消息。

这是我的完整示例代码:

Stackblitz

mat-error 仅适用于控件中的错误,不适用于 formGroup 中的错误。

但在将您的 dateCheck 更改为 return 一个带有 属性“验证器”而不是“日期”的对象之前

function dateCheck(): ValidatorFn {
  return (control: AbstractControl): { [key: string]: boolean } | null => {
    if (
      control.value.end_date &&  //<--check only if has value, not !==undefined
      (isNaN(control.value.end_date) ||
        control.value.end_date < control.value.start_date)
    ) {
      return { validator: true };  //<--see that it's "validator"
    }
    return null;
  };
}

然后创建一个customErrorMatcher

export class DateEndMatcher implements ErrorStateMatcher {
  isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
    const isSubmitted = form && form.submitted;
    //see the comparision
    return !!(control && (control.invalid || form.invalid) && (control.dirty || control.touched || isSubmitted));
  }
}

并在您的 .ts 中声明

endDateMatcher = new DateEndMatcher();

并在 .html

中使用
 <input matInput [matDatepicker]="picker2" formControlName='end_date' 
        [errorStateMatcher]="endDateMatcher">

您可以在 forked stackblitz

中看到

注意:在新的 material angular 中,您有一个范围日期选择器

Update 还有一种方法是使用 SetErrors

function dateCheck(): ValidatorFn {
  return (control: AbstractControl): { [key: string]: boolean } | null => {
    if (
      control.value.end_date &&
      (isNaN(control.value.end_date) ||
        control.value.end_date < control.value.start_date)
    ) {
      //indicate that setErrors
      control.get('end_date').setErrors({validator:true})
      return { validator: true };
    }
    if (control.value.end_date)
       control.get('end_date').setErrors(null) //<--put the setErrors to null
    return null;
  };
}