NgxElement enables to lazy load Angular components in non-angular applications. The library will register a custom element to which you can pass an attribute to specify what component you want to load.
It's a great way to use Angular in your CMS platform in an efficient manner.
This library depends on Angular Elements. You can install it by running:
$ ng add @angular/elements
$ npm install ngx-element --save
First of all, expose the Angular Component that should be loaded via a customElementComponent property.
...
@NgModule({
declarations: [TalkComponent],
...
exports: [TalkComponent],
entryComponents: [TalkComponent]
})
export class TalkModule {
customElementComponent: Type<any> = TalkComponent;
...
}
Just like with the Angular Router, define the map of component selector and lazy module.
const lazyConfig = [
{
selector: 'talk',
loadChildren: () => import('./talk/talk.module').then(m => m.TalkModule)
}
];
@NgModule({
...,
imports: [
...,
NgxElementModule.forRoot(lazyConfig)
],
...
})
export class AppModule {
...
ngDoBootstrap() {}
}
You can load your Angular component by adding an <ngx-element>
tag to the DOM in your non-angular application like follows:
<ngx-element
selector="talk"
data-title="Angular Elements"
data-description="How to write Angular and get Web Components"
data-speaker="Bruno">
</ngx-element>
You can listen to events emitted by Angular components.
Add an @Output
event to your component:
...
@Output() tagClick: EventEmitter<string> = new EventEmitter();
...
Then add an event listener to the tagClick
event on the appropiate <ngx-element>
element:
const talks = document.querySelector('ngx-element[selector="talk"]');
talks.addEventListener('tagClick', event => {
const emittedValue = event.detail;
...
});
Thanks to Juri Strumpflohner and ngx-lazy-el!