How can I add component dynamically?
toolbar.component.ts:
@Component({
selector: \'app-toolbar\',
template: \'
Expose viewContainerRef
on section.component.ts:
@Component({
selector: 'div[app-type=section]',
template: ''
})
export class SectionComponent {
@Input() active: boolean;
constructor(public viewContainerRef: ViewContainerRef) { }
}
Add an output to toolbar.component.ts:
@Component({
selector: 'app-toolbar',
template: ''
})
export class ToolbarComponent {
@Output() addComponentClick = new EventEmitter();
constructor() { }
}
In view.component.ts create a ComponentFactory
for TextComponents to add them dynamically to active SectionComponents:
import { Component, AfterViewInit, ViewChildren, QueryList, ElementRef, ComponentFactoryResolver, ComponentFactory, OnInit } from '@angular/core';
import { TextComponent } from './text.component';
import { SectionComponent } from './section.component';
@Component({
selector: 'app-view',
template: `
`
})
export class ViewComponent implements AfterViewInit, OnInit {
@ViewChildren(SectionComponent) sections: QueryList;
activeSections: SectionComponent[];
textComponentFactory: ComponentFactory;
constructor(private componentFactoryResolver: ComponentFactoryResolver) { }
ngOnInit() {
this.textComponentFactory = this.componentFactoryResolver.resolveComponentFactory(TextComponent);
}
ngAfterViewInit() {
this.activeSections = this.sections.reduce((result, section, index) => {
if(section.active) {
result.push(section);
}
return result;
}, []);
}
onAddComponentClick() {
this.activeSections.forEach((section) => {
section.viewContainerRef.createComponent(this.textComponentFactory);
});
}
}
StackBlitz example