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>
我的目标是在自定义验证器检测到错误时显示此错误消息。
这是我的完整示例代码:
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;
};
}
当 DatePicker 结束日期输入小于开始日期输入时,我无法正确实现 mat-error 样式更改。该按钮能够通过禁用自身来识别输入无效,但在 'end_date'.
上不会发生错误样式更改代码:
<mat-error *ngIf="userAddressValidations.hasError('validator')">
End date must be greater than start date.
</mat-error>
我的目标是在自定义验证器检测到错误时显示此错误消息。
这是我的完整示例代码:
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;
};
}