【发布时间】:2020-03-23 23:06:18
【问题描述】:
我正在尝试在自定义材质输入文本框中应用带有 ControlValueAccessor 的错误验证样式。自从应用此自定义组件以来,formControlName/FormBuilders 的所有红色边框验证状态都不会显示,对于必需的 minlength 等。在应用自定义控件之前,它本机(开箱即用)与 Angular Material 文本框一起工作。
目标是让自定义文本框与表单验证一起使用。这在 matInput 文本框中自然显示。
更新: 发布答案;但是不确定它是否最有效,试图让 Saloo 回答也能正常工作(如果有人可以发布 stackbliz,那就太好了),对任何更有效的选择开放
打字稿:
import { Component, OnInit, Input, ViewChild, EventEmitter, Output, forwardRef } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
@Component({
selector: 'app-input-textbox',
templateUrl: './input-textbox.component.html',
styleUrls: ['./input-textbox.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => InputTextboxComponent),
multi: true
}
]
})
export class InputTextboxComponent implements OnInit, ControlValueAccessor {
@Input() MaxLength: string;
@Input() Value: string;
@Input() type: string;
@Input() Label: string;
@Input() PlaceHolder: string;
@Output() saveValue = new EventEmitter();
@Output() onStateChange = new EventEmitter();
disabled: boolean;
constructor() { }
ngOnInit() {
}
saveValueAction(e) {
this.saveValue.emit(e.target.value);
}
onChange(e) {
this.Value = e;
}
onTouched() {
this.onStateChange.emit();
}
writeValue(value: any) {
this.Value = value ? value : '';
}
registerOnChange(fn: any) { this.onChange = fn; }
registerOnTouched(fn: any) { this.onTouched = fn; }
setDisabledState(isDisabled) { this.disabled = isDisabled; }
}
HTML:
<div class="input-wrap">
<mat-form-field appearance="outline">
<mat-label>{{Label}}</mat-label>
<input matInput
[attr.maxlength] = "MaxLength"
[value]="Value ? Value : ''"
[placeholder]="PlaceHolder ? PlaceHolder : ''"
[type]="type ? type: 'text'"
(input)="onChange($event.target.value)"
>
</mat-form-field>
</div>
尝试将此答案与 Angular Material 文本框的自然错误样式结合起来, Inheriting validation using ControlValueAccessor in Angular
【问题讨论】:
-
你能设置一个有效的 stackblitz 吗?
-
为什么这个问题被否决了?我提出了可靠的问题,以及我在下面经过深思熟虑的研究答案,寻找更优化的代码,
标签: angular typescript angular-material angular-reactive-forms angular8