Angular2 模板驱动的表单:如何为自定义表单控件创建字段验证?
Angular2 template driven forms: how to create field validation for a custom form control?
我想创建一个自定义表单控件来自行处理任何错误。这意味着显示该组件内部的错误。我创建了一个实现 ControlValueAccessor
的组件。我可以通过这样的形式读取错误:form.controls.myfieldname.errors.aErrorName
所以我将 form.controls.myfieldname
传递给我的 constom 控件。
是否有更好的方法来为自定义表单控件创建字段验证?
我的自定义控件:
@Component({
selector: 'input-text2',
templateUrl: './input-text2.component.html',
styleUrls: ['/input-base2.scss', './input-text2.component.scss'],
providers: [
{ provide: NG_VALUE_ACCESSOR, multi: true, useExisting: InputText2Component }
]
})
export class InputText2Component implements ControlValueAccessor {
// The control field: form.controls.fieldname
@Input() field;
@Input() label: string;
@Input() errorMessage: string;
value: string;
valueChange: (value: any) => void;
_onTouched: (value: any) => void;
writeValue(value: any): void {
this.value = value;
this.createClasses(this.size);
}
registerOnChange(fn: (value: any) => void): void {
this.valueChange = fn;
}
registerOnTouched(fn: (value: any) => void): void {
this._onTouched = fn;
}
}
布局:
<div *ngIf="field?.errors && field?.touched">
invalid
</div>
表格:
<form novalidate #form="ngForm">
<input-text2 [field]="form.controls.fieldname" name="fieldname" errorMessage="My error message" label="My label" [(ngModel)]="model"
custom-validator>
</input-text2>
</form>
所以我找到了答案
我将此添加到我的控件中:
private ngControl: NgControl;
constructor(private injector: Injector) {
}
ngOnInit(): void {
this.ngControl = this.injector.get(NgControl);
}
ngControl
现在和我的field
属性基本一样了。接下来我可以完全删除 field
并替换为 ngControl
.
我想创建一个自定义表单控件来自行处理任何错误。这意味着显示该组件内部的错误。我创建了一个实现 ControlValueAccessor
的组件。我可以通过这样的形式读取错误:form.controls.myfieldname.errors.aErrorName
所以我将 form.controls.myfieldname
传递给我的 constom 控件。
是否有更好的方法来为自定义表单控件创建字段验证?
我的自定义控件:
@Component({
selector: 'input-text2',
templateUrl: './input-text2.component.html',
styleUrls: ['/input-base2.scss', './input-text2.component.scss'],
providers: [
{ provide: NG_VALUE_ACCESSOR, multi: true, useExisting: InputText2Component }
]
})
export class InputText2Component implements ControlValueAccessor {
// The control field: form.controls.fieldname
@Input() field;
@Input() label: string;
@Input() errorMessage: string;
value: string;
valueChange: (value: any) => void;
_onTouched: (value: any) => void;
writeValue(value: any): void {
this.value = value;
this.createClasses(this.size);
}
registerOnChange(fn: (value: any) => void): void {
this.valueChange = fn;
}
registerOnTouched(fn: (value: any) => void): void {
this._onTouched = fn;
}
}
布局:
<div *ngIf="field?.errors && field?.touched">
invalid
</div>
表格:
<form novalidate #form="ngForm">
<input-text2 [field]="form.controls.fieldname" name="fieldname" errorMessage="My error message" label="My label" [(ngModel)]="model"
custom-validator>
</input-text2>
</form>
所以我找到了答案
我将此添加到我的控件中:
private ngControl: NgControl;
constructor(private injector: Injector) {
}
ngOnInit(): void {
this.ngControl = this.injector.get(NgControl);
}
ngControl
现在和我的field
属性基本一样了。接下来我可以完全删除 field
并替换为 ngControl
.