Best way to quickly use Dynamic Components with Angular
Use like NgComponentOutlet
but with @Input/@Output
auto bindings:
<!-- host component -->
<app-dynamic
<!-- dynamic component -->
[ngxComponentOutlet]="component"
<!-- regular input -->
[entity]="entity"
<!-- regular output -->
(action)="onAction($event)">
</app-dynamic>
Feature | NgxComponentOutlet | ComponentFactoryResolver | NgComponentOutlet |
---|---|---|---|
Friendliness | ⭐⭐⭐ | ⭐ | ⭐⭐ |
Dynamic Components | ✅ | ✅ | ✅ |
AOT support | ✅ | ✅ | ✅ |
Reactivity | ✅ | ✅ | ✅ |
Injector | ✅ | ✅ | ✅ |
NgModule | ✅ | ✅ | ✅ |
projectionNodes | ✅ | ✅ | ✅ |
Component Access | ✅ | ✅ | ❌ |
Lifecycle OnChanges | ✅ | ⭕️ manually | ❌ |
Binding @Input() |
✅ | ⭕️ manually | ❌ |
Binding @Output() |
✅ | ⭕️ manually | ❌ |
Activate Event | ✅ | ⭕️ manually | ❌ |
Deactivate Event | ✅ | ⭕️ manually | ❌ |
List of heroes
Table of heroes with table schema form
npm install --save ngx-component-outlet
yarn add ngx-component-outlet
import { NgxComponentOutletModule } from 'ngx-component-outlet';
@NgModule({
declarations: [ AppComponent ],
imports: [ NgxComponentOutletModule.forRoot() ],
bootstrap: [ AppComponent ]
})
export class AppModule {}
@Component({
selector: 'app-dynamic-comp-a',
template: `I'm Dynamic Component A. Hello, {{ name }}!`
})
export class CompAComponent {
@Input() name: string;
}
@Component({
selector: 'app-dynamic-comp-b',
template: `I'm Dynamic Component B. Hello, {{ name }}!`
})
export class CompBComponent {
@Input() name: string;
}
@NgModule({
...
declarations: [ ..., CompAComponent, CompBComponent ],
entryComponents: [ CompAComponent, CompBComponent ]
})
export class AppModule {}
@Component({
selector: 'app-host-for-dynamic',
template: ''
})
export class HostComponent {
@Input() name: string;
}
@NgModule({
...
declarations: [ ..., HostComponent ],
...
})
export class AppModule {}
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
<app-host-for-dynamic [ngxComponentOutlet]="componentA"
[name]="'Angular 5!'"></app-host-for-dynamic>
<app-host-for-dynamic [ngxComponentOutlet]="componentB"
[name]="'Angular 6?'"></app-host-for-dynamic>
`
})
export class AppComponent {
componentA = CompAComponent;
componentB = CompBComponent;
}
import { NgxComponentOutletModule } from 'ngx-component-outlet';
@NgModule({
imports: [ NgxComponentOutletModule.forRoot() ],
declarations: [ AppComponent, CompAComponent, CompBComponent, HostComponent ],
entryComponents: [ CompAComponent, CompBComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule {}
Input | Type | Default | Required | Description |
---|---|---|---|---|
[ngxComponentOutlet] |
Type<any> |
n/a | yes | |
[ngxComponentOutletInjector] |
Injector |
n/a | no | |
[ngxComponentOutletContent] |
any[][] |
n/a | no | |
[ngxComponentOutletNgModuleFactory] |
NgModuleFactory<any> |
n/a | no |
Output | Type | Description |
---|---|---|
(ngxComponentOutletActivate) |
any |
|
(ngxComponentOutletDeactivate) |
any |
Here is a demo repository showing ngx-component-outlet and Angular in action.