this blog post'dan türetilmiş bir Açısal bileşen oluşturdum. Reaktif bir formda var ve form denetimi hatalarını almak istiyorum, bileşenin kendisi üzerinde denetimin bir hata olduğunda oluşturulacak stilize bir hata iletisi olacaktır. Ancak, NgControl sınıfını bileşene enjekte etmeye çalıştığımda, döngüsel referans sorunları alıyorum, bu yüzden kontrolde hatalara nasıl erişebilirim?ControlValueAccessor'u uygulayan bir bileşenden FormControl'e nasıl başvuru yapabilirim?
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;
}
}
şablon dosyasını:
<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>
size özel denetime formGroup geçiyoruz sonucudur? FormGroup'un referansını, özel denetimde ana şablon dalışınıza iletin ve tamamlayın. Hiçbir ControlValueAccessor ve uygulamaları gerek yok. –