import { Injectable, Type, ViewContainerRef, ApplicationRef, ComponentFactory, ComponentFactoryResolver, ComponentRef } from '@angular/core'; @Injectable() export class DynamicComponentService { constructor(private componentFactoryResolver: ComponentFactoryResolver, private applicationRef: ApplicationRef) { } //Creates a component dynamically (aka during runtime). If a view container is not specified, it will append the new component to the app root. //To subscribe to an event from invoking component: componentRef.instance.clicked.subscribe((m) => console.log(m.name)); public createDynamicComponent(componentType: Type, viewContainerRef?:ViewContainerRef): ComponentRef { viewContainerRef = viewContainerRef || this.getRootViewContainerRef(); viewContainerRef.clear(); let factory: ComponentFactory = this.componentFactoryResolver.resolveComponentFactory(componentType); //Ref: https://angular.io/guide/dynamic-component-loader let componentRef: ComponentRef = viewContainerRef.createComponent(factory); return componentRef; } private getRootViewContainerRef(): ViewContainerRef { return this.applicationRef.components[0].instance.viewContainerRef; } };