я пытаюсь сделать реактивную форму с динамическим вводом
поэтому я создал компонент реактивной формы, подобный этому
main_component.ts
constructor(private formBuilder: FormBuilder) {
this.operationGroupForm = this.formBuilder.group({
'operation': '',
'searchTerm': ''
});
}
main_component.html
<form [formGroup]="operationGroupForm">
<input type="text" formControlName="operation">
<div operationClass [type]="'mycustomtype'"
[_formControlName]="'searchTerm'"></div>
</div>
</form>
и создал директиву operationClass
, которая добавилась к div и внедрила компонент в div
operationClass.directive.ts
constructor(private el: ElementRef, private render: Renderer2, private viewContainerRef: ViewContainerRef,
private componentFactory: ComponentFactoryResolver) {}
ngOnInit(): void {
var comRef = this.componentFactory.resolveComponentFactory(input_component);
var _comRef = this.viewContainerRef.createComponent(comRef);
_comRef.instance.formControlName = this._formControlName;
_comRef.instance.type = this.type;
}
и этот компонент отображает правильный ввод, принимая formControlName
и type
и отображая ввод в настраиваемых условиях.
и этот компонент для рендеринга ввода: input_component.ts
@Input() formControlName: string;
@Input() type: string;
constructor() {
}
ngOnInit(): void {
}
input_component.html
<ng-container *ngIf="type">
<ng-container [ngSwitch]="type">
<ng-container *ngSwitchCase="'mycustomtype'">
<input type="text" [formControlName]="formControlName" class="form-control" />
</ng-container>
<ng-container *ngSwitchDefault>
<input type="number" [formControlName]="formControlName" class="form-control" />
</ng-container>
</ng-container>
</ng-container>
проблема в том, что, как я думаю, внутренний ввод formControlName
не может видеть внешний formGroup
, потому что он генерирует эту ошибку
ERROR Error: formControlName must be used with a parent formGroup directive. You'll want to add a formGroup
directive and pass it an existing FormGroup instance (you can create one in your class).
Example:
<div [formGroup]="myGroup">
<input formControlName="firstName">
</div>
In your class:
this.myGroup = new FormGroup({
firstName: new FormControl()
});
at Function.controlParentException (forms.js:1692)
at FormControlName._checkParentType (forms.js:6059)
at FormControlName._setUpControl (forms.js:6063)
at FormControlName.ngOnChanges (forms.js:5995)
at FormControlName.rememberChangeHistoryAndInvokeOnChangesHook (core.js:2131)
at callHook (core.js:3042)
at callHooks (core.js:3008)
at executeInitAndCheckHooks (core.js:2960)
at refreshView (core.js:7331)
at refreshEmbeddedViews (core.js:8408)