import { Component, ViewContainerRef, ViewChild, ComponentFactoryResolver, ReflectiveInjector, Type } from '@angular/core'; import {DialogComponent} from "./dialog.component"; import {DialogService} from "./dialog.service"; @Component({ selector: 'dialog-wrapper', template: ` ` }) export class DialogWrapperComponent { /** * Target element to insert dialog content component */ @ViewChild('element', {read: ViewContainerRef}) public element: ViewContainerRef; /** * Link container DOM element */ @ViewChild('container') public container; /** * Dialog content componet * @type {DialogComponent} */ private content: DialogComponent; /** * Constructor * @param {ComponentFactoryResolver} resolver * @param {DialogService} dialogService */ constructor(private resolver: ComponentFactoryResolver, private dialogService: DialogService) {} /** * Adds content dialog component to wrapper * @param {Type} component * @return {DialogComponent} */ addComponent(component: Type>) { let factory = this.resolver.resolveComponentFactory(component); let injector = ReflectiveInjector.fromResolvedProviders([], this.element.injector); let componentRef = factory.create(injector); this.element.insert(componentRef.hostView); this.content = > componentRef.instance; this.content.wrapper = this; return this.content; } /** * Registers event handler to close dialog by click on backdrop */ closeByClickOutside() { const containerEl = this.container.nativeElement; containerEl.querySelector('.modal-content').addEventListener('click', (event)=> { event.stopPropagation(); }); containerEl.addEventListener('click', () => { this.dialogService.removeDialog(this.content); }, false); } }