Angular6 Material 带有验证错误的自定义表单字段控件(mat-error)
Angular6 Material custom form field control with validation errors (mat-error)
如何制作Material自定义表单字段控件(like this one)以支持表单验证并使用mat-error显示它们?
我知道常规的 matInput 指令使用 ErrorStateMatcher (doc),但我不明白如何使用自定义表单字段 link 它。
您可以从示例中的 FocusMonitor
中查看
,它可以是这样的:
fm.monitor(elRef.nativeElement, true).subscribe(origin => {
if (this.parts.status === 'INVALID') {
this.errorState = true;
}
this.focused = !!origin;
this.stateChanges.next();
});
思路是material提供errorState
,从组件的类型就可以看出来,所以只要你改变它,它就会反映到组件上,希望对你有帮助!
通过查看 Material2 (https://github.com/angular/components/blob/master/src/material/select/select.ts) 中的一些现有组件,我找到了解决方案。我按照这个例子
创建了一个基础 class
export const _MatSelectMixinBase:
CanDisableCtor &
HasTabIndexCtor &
CanDisableRippleCtor &
CanUpdateErrorStateCtor &
typeof MatSelectBase =
mixinDisableRipple(mixinTabIndex(mixinDisabled(mixinErrorState(MatSelectBase))));
我不得不从 Material 存储库中复制一些类型,例如 CanUpdateErrorStateCtor。
然后更新我的构造函数以注入 ErrorStateMatcher,最后在 ngDoCheck 中执行此操作:
ngDoCheck() {
if (this.ngControl) {
this.updateErrorState();
}
}
解决方法正确!重用 material 核心的 mixinErrorState 是处理它的最佳方式。我最近发布了一个关于自定义表单域的详细视频,其中还详细解释了自定义表单域中的错误处理。对于其他通过观看视频更好地理解的人来说可能会很有趣 https://youtu.be/AZsw2nRxkBk?t=825
如果您按照 the official guide 创建自定义 material 表单域,
并且您在构造函数中声明了 ngControl
:
constructor(
...,
@Optional() @Self() public ngControl: NgControl) {
...
if (this.ngControl != null) {
this.ngControl.valueAccessor = this;
}
}
您只需要:
get errorState(): boolean {
return this.ngControl.invalid && this.ngControl.dirty;
}
进行验证。
如何制作Material自定义表单字段控件(like this one)以支持表单验证并使用mat-error显示它们? 我知道常规的 matInput 指令使用 ErrorStateMatcher (doc),但我不明白如何使用自定义表单字段 link 它。
您可以从示例中的 FocusMonitor
中查看
,它可以是这样的:
fm.monitor(elRef.nativeElement, true).subscribe(origin => {
if (this.parts.status === 'INVALID') {
this.errorState = true;
}
this.focused = !!origin;
this.stateChanges.next();
});
思路是material提供errorState
,从组件的类型就可以看出来,所以只要你改变它,它就会反映到组件上,希望对你有帮助!
通过查看 Material2 (https://github.com/angular/components/blob/master/src/material/select/select.ts) 中的一些现有组件,我找到了解决方案。我按照这个例子
创建了一个基础 classexport const _MatSelectMixinBase:
CanDisableCtor &
HasTabIndexCtor &
CanDisableRippleCtor &
CanUpdateErrorStateCtor &
typeof MatSelectBase =
mixinDisableRipple(mixinTabIndex(mixinDisabled(mixinErrorState(MatSelectBase))));
我不得不从 Material 存储库中复制一些类型,例如 CanUpdateErrorStateCtor。
然后更新我的构造函数以注入 ErrorStateMatcher,最后在 ngDoCheck 中执行此操作:
ngDoCheck() {
if (this.ngControl) {
this.updateErrorState();
}
}
解决方法正确!重用 material 核心的 mixinErrorState 是处理它的最佳方式。我最近发布了一个关于自定义表单域的详细视频,其中还详细解释了自定义表单域中的错误处理。对于其他通过观看视频更好地理解的人来说可能会很有趣 https://youtu.be/AZsw2nRxkBk?t=825
如果您按照 the official guide 创建自定义 material 表单域,
并且您在构造函数中声明了 ngControl
:
constructor(
...,
@Optional() @Self() public ngControl: NgControl) {
...
if (this.ngControl != null) {
this.ngControl.valueAccessor = this;
}
}
您只需要:
get errorState(): boolean {
return this.ngControl.invalid && this.ngControl.dirty;
}
进行验证。