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 @apaq/ngx-element
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 = {
definitions: [
{
selector: 'talk',
loadChildren: () => import('./talk/talk.module').then(m => m.TalkModule)
}
],
prefix: 'ws'
];
@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:
<ws-talk
title="Angular Elements"
description="How to write Angular and get Web Components"
speaker="Bruno">
</ws-talk>
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('ws-talk');
talks.addEventListener('tagClick', event => {
const emittedValue = event.detail;
...
});