6
我创建了一个衍生自this blog post的角度分量。我使用反应形式,我想在窗体控件上获取错误,组件本身会有一个程式化的错误消息,当控件出现错误时它会呈现。但是,当我尝试将NgControl类注入组件时,我得到循环引用问题,那么如何访问控件上的错误?如何从实现ControlValueAccessor的组件获取对FormControl的引用?
下面是当前的代码,它尚未完成,但是它应该给的什么,我试图完成的基本思想:
import { Component, Output, EventEmitter, Input, forwardRef } from '@angular/core';
import {
NgControl,
NG_VALUE_ACCESSOR,
ControlValueAccessor,
Validator,
AbstractControl,
FormControl,
NG_VALIDATORS
} from '@angular/forms';
@Component({
selector: 'form-field-input',
templateUrl: './form-field-input.component.html',
styleUrls: ['./form-field-input.component.less'],
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => FormFieldInputComponent),
multi: true
}]
})
export class FormFieldInputComponent implements ControlValueAccessor {
private propagateChange = (_: any) => { };
private propagateTouch = (_: any) => { };
@Input('label') label: string;
@Input('type') type: string;
@Input('id') id: string;
@Input('formControlName') formControlName: string;
@Input('error') error: string;
@Input('classes') classes: any;
private value: string;
private data: any;
constructor() {
debugger;
}
private onChange(event) {
this.data = event.target.value;
this.propagateChange(this.data);
this.propagateTouch(this.data);
}
writeValue(obj: any): void {
this.data = obj;
}
registerOnChange(fn: any): void {
this.propagateChange = fn;
}
registerOnTouched(fn: any): void {
this.propagateTouch = fn;
}
}
模板文件:
<div class="form-field-input-component">
<input id="{{id}}"
type="{{type}}"
class="form-field-input"
[value]="data"
(change)="onChange($event)"
(keyup)="onChange($event)" />
<span class="context-icon fa fa-lock"></span>
<span class="info-icon fa fa-info-circle"></span>
<!-- I will have an NGIF here to check for errors before rendering the error -->
<div class="form-error">
{{ error }}
</div>
</div>
如果您正在过formGroup您的自定义控制的最终结果,为什么你需要ControlValueAccessor和自定义控制所有的执行? 只需将FormGroup的引用传递给自定义控件中模板的父级潜水并完成。不需要任何ControlValueAccessor和实现。 –