Angular2 自定义表单控件,包括文本字段和错误消息
Angular2 custom form control including textfield and error message
我想编写自定义表单控件,包括一个文本字段和一个错误消息工具提示,它适用于模型驱动表单。
在 RC5 中,像下面这样的代码可能工作正常,但在 2.0 中,它不能。
https://embed.plnkr.co/bvFbsf5q74j7eHWuh5y7/
有没有办法与主机 formControl 和子 ngModel 建立关系,
或者从内部访问主机 formControl?
不然有没有办法实现这个想法?
我找到路了。
最后,我的代码变成了这样
@Component({
selector: 'custom-input',
template: `
<input type="text" [required]="required" [(ngModel)]="value" #model="ngModel"/>
<div>inner ngModel errors: {{model.errors|json}}</div>
<div>ngControl errors: {{ngControl.errors|json}}</div>
`,
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CustomInput),
multi: true
}]
})
export class CustomInput implements ControlValueAccessor, OnInit {
private innerValue: any = '';
private ngControl: NgControl;
@Input() required: boolean;
private onTouchedCallback = () => {};
private onChangeCallback = (_: any) => {};
constructor(private injector: Injector) { }
ngOnInit(): void {
this.ngControl = this.injector.get(NgControl);
}
get value(): any {
return this.innerValue;
};
set value(v: any) {
if (v !== this.innerValue) {
this.innerValue = v;
this.onChangeCallback(v);
}
}
onBlur() { this.onTouchedCallback() }
writeValue(value: any) {
if (value !== this.innerValue) {
this.innerValue = value;
}
}
registerOnChange(fn: any) { this.onChangeCallback = fn }
registerOnTouched(fn: any) { this.onTouchedCallback = fn }
}
host ngControl可以从injector获取,如injector.get(NgControl)
。
ngControl 有我想要的 errors
个对象。
我想编写自定义表单控件,包括一个文本字段和一个错误消息工具提示,它适用于模型驱动表单。
在 RC5 中,像下面这样的代码可能工作正常,但在 2.0 中,它不能。 https://embed.plnkr.co/bvFbsf5q74j7eHWuh5y7/
有没有办法与主机 formControl 和子 ngModel 建立关系, 或者从内部访问主机 formControl?
不然有没有办法实现这个想法?
我找到路了。
最后,我的代码变成了这样
@Component({
selector: 'custom-input',
template: `
<input type="text" [required]="required" [(ngModel)]="value" #model="ngModel"/>
<div>inner ngModel errors: {{model.errors|json}}</div>
<div>ngControl errors: {{ngControl.errors|json}}</div>
`,
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CustomInput),
multi: true
}]
})
export class CustomInput implements ControlValueAccessor, OnInit {
private innerValue: any = '';
private ngControl: NgControl;
@Input() required: boolean;
private onTouchedCallback = () => {};
private onChangeCallback = (_: any) => {};
constructor(private injector: Injector) { }
ngOnInit(): void {
this.ngControl = this.injector.get(NgControl);
}
get value(): any {
return this.innerValue;
};
set value(v: any) {
if (v !== this.innerValue) {
this.innerValue = v;
this.onChangeCallback(v);
}
}
onBlur() { this.onTouchedCallback() }
writeValue(value: any) {
if (value !== this.innerValue) {
this.innerValue = value;
}
}
registerOnChange(fn: any) { this.onChangeCallback = fn }
registerOnTouched(fn: any) { this.onTouchedCallback = fn }
}
host ngControl可以从injector获取,如injector.get(NgControl)
。
ngControl 有我想要的 errors
个对象。