You need to use ComponentFactoryResolver and ViewContainerRef. Here's the precise approach:
1. Create a Dynamic Component
First, ensure your component is declared as entryComponent (for Angular versions < 9) or properly included in your module:
@Component({
selector: 'app-dynamic',
template: `<h2>Dynamic Component</h2>`
})
export class DynamicComponent {}
2. Implement the Dynamic Injection
In your parent component:
@Component({
selector: 'app-parent',
template: `
<ng-template appComponentHost></ng-template>
<button (click)="loadComponent()">Load Component</button>
`
})
export class ParentComponent implements OnInit {
@ViewChild(ComponentHostDirective, {static: true}) componentHost: ComponentHostDirective;
constructor(private componentFactoryResolver: ComponentFactoryResolver) {}
loadComponent() {
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(DynamicComponent);
const viewContainerRef = this.componentHost.viewContainerRef;
viewContainerRef.clear();
viewContainerRef.createComponent(componentFactory);
}
}
3. Update Your Module
@NgModule({
declarations: [
ParentComponent,
DynamicComponent,
ComponentHostDirective
],
entryComponents: [DynamicComponent] // Required for Angular < 9
})
export class AppModule { }