import { ComponentType } from '@angular/core/src/render3'; import { Injectable, Injector, TemplateRef } from '@angular/core'; import { DialogComponent } from '../components'; import { DomService } from '../../../shared/dom/dom.service'; import { PortalInjector } from '../../../shared/portal/portal-injector'; import { extendObject } from '../../../shared/util/object-extend'; @Injectable() export class DialogService { constructor( private injector: Injector, private domService: DomService, ) {} public open(componentOrTemplateRef: ComponentType | any | TemplateRef, config: any): any { config = { ...{ hasBackdrop: true }, ...config }; const componentRef = this.getComponentRef(config); (componentRef.instance as any)._setComponent(componentOrTemplateRef); return componentRef.instance as DialogComponent; } private getComponentRef(config: any) { const injectionTokens = new WeakMap(); injectionTokens.set(DialogComponent, DialogComponent); const injector = new PortalInjector(this.injector, injectionTokens); const componentRef = this.domService.attachComponentPortal(DialogComponent, injector); (componentRef.instance as any).config = extendObject({}, config); (componentRef.instance as any).afterClosed().subscribe(() => { componentRef.destroy(); }); return componentRef; } }