为什么在使用自定义全局验证器的角度材料6的垫形字段内未显示垫错误

时间:2018-07-21 13:19:55

标签: angular angular-material2 angular6 angular-material-6

我正在使用角材6,当在垫形字段之后移动到正确显示的垫形错误时,我没有显示垫形字段内的错误。

无效代码:

 <mat-form-field>
<input matInput 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>
     </mat-form-field>

工作正常:

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

有人解释了为什么在该控件中不起作用。

现场演示: stackblitz

3 个答案:

答案 0 :(得分:6)

是的,mat-error默认不显示。仅在输入为touched时显示。

但是,幸运的是,您可以使用绑定到errorStateMatcher元素的mat-input输入属性来覆盖此行为。

添加了此功能的pull request

用法:

<mat-form-field>
    <input matInput [errorStateMatcher]="matcher" [matDatepicker]="picker" placeholder="Choose a Start date" 
    formControlName="FromDate"
      [min]="minFromDate" 
           [max]="maxToDate" >
    <mat-datepicker-toggle matSuffix [for]="picker" ></mat-datepicker-toggle>
    <mat-datepicker #picker></mat-datepicker>
    <mat-error >Please provide a valid Fromdate</mat-error> 
  </mat-form-field> 

因此,您必须以这种方式在代码中实现ErrorStateMatcher

export class MyErrorStateMatcher implements ErrorStateMatcher {
  isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
    const isSubmitted = form && form.submitted;
    return (control && control.invalid);
  }
}

然后在您的组件中为matcher类添加一个新对象ErrorStateMatcher,它将作为[errorStateMatcher]="matcher"的值

matcher = new MyErrorStateMatcher();

我还在您的分叉stackblitz

中添加了相同的代码

建议

您无需为ngIf提供mat-error的条件来指定您的formControlName。系统会根据其中的mat-form-field自动考虑它。

答案 1 :(得分:1)

我找到了一个非常简单的解决方案,而没有覆盖ErrorStateMatcher类,只需导入app.module.ts

import { ErrorStateMatcher, ShowOnDirtyErrorStateMatcher } from '@angular/material'; 
  @NgModule({  providers: [AlertService, { provide: ErrorStateMatcher, useClass: ShowOnDirtyErrorStateMatcher }],})

答案 2 :(得分:0)

全局,打字或触摸时显示 mat-error: 与提供的解决方案不同,此方法将处理所有 mat-errors,而无需将匹配器应用于每个输入字段。

1- 创建 touched-error-state.matcher.ts 文件:

import {FormControl, FormGroupDirective, NgForm } from '@angular/forms';
import {ErrorStateMatcher} from '@angular/material/core';

export class TouchedErrorStateMatcher implements ErrorStateMatcher {
    isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
        return !!(control && control.invalid && (control.dirty || control.touched));
    }
}

2- 在 app.module 导入:

import { ErrorStateMatcher } from '@angular/material/core';
import { TouchedErrorStateMatcher } from './your-folder-path/touched-error-state.matcher';

3- 现在将其提供给提供者:

@NgModule({
  providers: [
    AuthService,
    UserService,
    { provide: ErrorStateMatcher, useClass: TouchedErrorStateMatcher }
  ],
})

4- 重新提供应用程序。