我找到了方法。
最后,我的代码变成这样。
@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 }
}
主机ngControl可以从注入器获得,如injector.get(NgControl)
。 而ngControl有errors
我想要的对象。