Olá Mario, tudo certo.
Consegui mesclar duas soluções para atingir o objetivo. Primeiramente utilizei o ngx-modialog para relacionar a exibição de um dialog customizável com algum componente. E por fim, estruturei um módulo com um serviço servindo de ponte para a renderização do componente no dialog.
Aqui está o código do módulo, onde declaro meu serviço e o entryComponents (esse a propósito ainda não entendi o conceito, mas foi necessário para o código funcionar rs)
import { NgModule } from '@angular/core';
import { ModialogService } from './modialog.service';
import { ModalModule } from 'ngx-modialog';
import { BootstrapModalModule } from 'ngx-modialog/plugins/bootstrap';
import { ModialogComponent } from './modialog.component';
@NgModule({
declarations: [ModialogComponent],
exports: [],
imports: [
ModalModule.forRoot(),
BootstrapModalModule
],
providers: [ModialogService],
entryComponents: [ModialogComponent]
})
export class ModialogModule{}
Aqui está o código do serviço. Nele temos a função 'openDialog' que recebe o componente que será renderizado no corpo do dialog e retorna uma promisse.
Essa função é a que chamamos em qualquer lugar para montagem de um dialog.
import { Component, ViewContainerRef, Injectable } from '@angular/core';
import { Overlay } from 'ngx-modialog';
import { Modal } from 'ngx-modialog/plugins/bootstrap';
import { ModialogComponent } from './modialog.component';
import { BSModalContext } from 'ngx-modialog/plugins/bootstrap';
import { overlayConfigFactory } from "ngx-modialog";
@Injectable()
export class ModialogService{
constructor(private modal: Modal) {}
openDialog(componentOnBody) {
let dialog = this.modal.open(ModialogComponent, overlayConfigFactory({component:componentOnBody}, BSModalContext));
return dialog.then(promisse => promisse);
}
}
Aqui é o código do componente que recebe os parâmetros da função 'openDialog' e faz a substituição do template pelo componente passado.
import { Component, ViewChild, ViewContainerRef, ComponentFactoryResolver, ComponentFactory, ComponentRef, AfterViewInit } from '@angular/core';
import { DialogRef, ModalComponent, CloseGuard } from 'ngx-modialog';
import { BSModalContext } from 'ngx-modialog/plugins/bootstrap';
export class CustomModalContext extends BSModalContext{
public component;
public ref;
}
@Component({
selector: 'modialog-template',
templateUrl: './modialog.component.html'
})
export class ModialogComponent implements ModalComponent<CustomModalContext>, CloseGuard, AfterViewInit{
context: CustomModalContext
@ViewChild('modalBody', {read: ViewContainerRef}) container;
private componentRef: ComponentRef<any>;
constructor(public dialog: DialogRef<CustomModalContext>, private _resolver: ComponentFactoryResolver){
this.context = dialog.context;
this.dialog.setCloseGuard(this);
}
closeModal(){
this.dialog.close();
this.dialog.destroy();
}
beforeDismiss(): boolean{
return true;
}
beforeClose(): boolean{
return true;
}
createComponentOnBody(){
this.container.clear();
const factory: ComponentFactory<any> = this._resolver.resolveComponentFactory(this.context.component);
this.componentRef = this.container.createComponent(factory);
this.context.ref = this.componentRef;
/*for(var prop in variables){
console.log(prop + " = " + variables[prop]);
this.componentRef.instance.prop = variables[prop];
}*/
//this.componentRef.instance.type = 'Danget';
}
ngOnDestroy() {
this.componentRef.destroy();
}
ngAfterViewInit(){
this.createComponentOnBody();
}
}
Template do modialog.componente.ts
<div class="modal-dialog modal-lg" style="padding:0px;margin:0px;">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Modal Header</h4>
</div>
<div class="modal-body">
<ng-template #modalBody></ng-template>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal" (click)="closeModal()">Close</button>
</div>
</div>
</div>
Um exemplo de como utilizar.
//Importando serviço
import { ModialogService } from '../ngx-modialog-example/modialog.service';
@Component({
(...)
})
export class App{
(...)
//Inicializando serviço
constructor(private _modal: ModialogService){}
callModialog(){
//Chamando a abertura do dialog inserindo o componente 'AlertComponent' como parâmetro
this._modal.openDialog(AlertComponent).then(ref=>console.log(ref))
});
}
}