Я пытаюсь экспортировать элемент управления формы в качестве углового элемента (веб-компонента) и заставить его работать как собственный элемент ввода, чтобы его можно было использовать с угловыми реактивными формами или аналогичными библиотеками, которые работают с собственными HTML-входами.
Нижеследующий код работает, когда он экспортируется как угловой компонент в модуль.У меня возникают проблемы, когда я экспортирую это как веб-компонент и пытаюсь использовать его в реактивной форме.
этот код написан с использованием платформы Angular 7.1.
шаблон компонента
<input ngDefaultControl value="value" />
код компонента:
@Component({
selector: 'cns-text-input',
templateUrl: './text-input.component.html',
styleUrls: ['./text-input.component.scss'],
providers: [ {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TextInputComponent),
multi: true
}]
})
export class TextInputComponent implements ControlValueAccessor, AfterViewInit {
@ViewChild(DefaultValueAccessor) valueAccessor: DefaultValueAccessor;
public ngAfterViewInit() {
console.log('value accessor', this.valueAccessor);
console.log(this);
}
public writeValue(obj: any): void {
this.valueAccessor.writeValue(obj);
}
public registerOnChange(fn: any): void {
this.valueAccessor.registerOnChange(fn);
}
public registerOnTouched(fn: any): void {
this.valueAccessor.registerOnTouched(fn);
}
public setDisabledState?(isDisabled: boolean): void {
this.valueAccessor.setDisabledState(isDisabled);
}
}
код модуля:
@NgModule({
declarations: [TextInputComponent],
imports: [FormsModule],
// exports: [TextInputComponent],
entryComponents: [TextInputComponent]
})
export class FormModule {
constructor(private injector: Injector) {
const textInputElement = createCustomElement(TextInputComponent, {
injector
});
customElements.define('cns-text-input', textInputElement);
}
ngDoBootstrap() {}
}
пример использования:
// app component html
<form [formGroup]="group">
<cns-text-input formControlName="text"></cns-text-input>
</form>
// app component
export class AppComponent {
title = 'web-components-lib-poc';
public group: FormGroup;
constructor(private fb: FormBuilder) {
this.group = this.fb.group({ text: 'my vlaue' });
this.group.valueChanges.subscribe(val => console.log(val));
}
}
Приведенный выше код приводит к ошибке: ОШИБКА Ошибка: Нет доступа к значению для элемента управления формы с именем: 'text'
Есть ли лучший способ построить этот компонент так, чтобы он вел себя больше какродной ввод?