import { Component, ComponentRef, Injectable, ViewContainerRef } from '@angular/core';
import { ComponentPortal, DomPortalOutlet } from '@angular/cdk/portal';
@Injectable({ providedIn: 'root' })
export class PortalService {
mountWidget(container: HTMLElement, WidgetComponent: any) {
// Create portal from component
const portal = new ComponentPortal(WidgetComponent);
// Create outlet in remote DOM
const outlet = new DomPortalOutlet(
container,
this.cfr,
this.appRef,
this.injector
);
// Mount and return reference
return outlet.attach(portal);
}
constructor(
private cfr: ComponentFactoryResolver,
private appRef: ApplicationRef,
private injector: Injector
) {}
}
// Usage in any component:
widgetRef: ComponentRef<Widget> = this.portalService.mountWidget(
document.getElementById('plugin-slot')!,
UserWidgetComponent
);