我有一组表单域在动态创建的组件中。父组件拥有form
标记。但是,没有任何表单域被添加到Form
。我使用的是ComponentFactoryResolver
创建组件:Angular 2:如何在动态创建的组件中链接表单元素?
@Component({
selector: 'fieldset-container',
templateUrl: './fieldset-container.component.html',
styleUrls: ['./fieldset-container.component.scss'],
entryComponents: ALL_FIELD_SETS,
})
export class FieldsetContainerComponent<C> {
fieldsetComponent : ComponentRef<any> = null;
@Input() formGroup : FormGroup;
@ViewChild('fieldSetContainer', {read: ViewContainerRef})
fieldsetContainer : ViewContainerRef;
@Output() onComponentCreation = new EventEmitter<ComponentRef<any>>();
constructor(private resolver : ComponentFactoryResolver) {
}
@Input() set fieldset(fieldset : {component : any, resolve : any }) {
if(!fieldset) return; // sorry not right
// Inputs need to be in the following format to be resolved properly
let inputProviders = Object.keys(fieldset.resolve).map((resolveName) => {return {provide: resolveName, useValue: fieldset.resolve[resolveName]};});
let resolvedInputs = ReflectiveInjector.resolve(inputProviders);
// We create an injector out of the data we want to pass down and this components injector
let injector = ReflectiveInjector.fromResolvedProviders(resolvedInputs, this.fieldsetContainer.parentInjector);
// We create a factory out of the component we want to create
let factory = this.resolver.resolveComponentFactory(findComponentForFieldset(fieldset.component));
// We create the component using the factory and the injector
let component : ComponentRef<any> = factory.create(injector);
// We insert the component into the dom container
this.fieldsetContainer.insert(component.hostView);
// Destroy the previously created component
if (this.fieldsetComponent) {
this.fieldsetComponent.destroy();
}
this.fieldsetComponent = component;
this.onComponentCreation.emit(this.fieldsetComponent);
}
}
模板:
<div #fieldSetContainer [formGroup]="formGroup"></div>
动态成分的使用:
<form class="form" #omaForm="ngForm">
<div *ngFor="let fieldset of page?.fieldsets">
<fieldset-container [fieldset]="{ component: fieldset, resolve: {} }" (onComponentCreation)="onComponentCreation($event)" [formGroup]="omaForm.form"></fieldset-container>
</div>
</form>
我怀疑它有与注射器没有正确连接有关,但从我可以ñ告诉它被链接到父母。我已经在NgModel中设置了一个断点,并且它传递了一个null作为parent的问题。我将它追溯到看起来编译的东西,而且只是编写了一个空值。所以我不确定那里是如何用硬编码的零点创建的。
有关如何解决此问题的任何想法?
我认为我们需要工作示例来重现请创建一个plunker。 – yurzui