npm.io
0.0.8 • Published 8 years ago

ngx-component-outlet

Licence
MIT
Version
0.0.8
Deps
1
Size
212 kB
Vulns
0
Weekly
0
Stars
320
DeprecatedThis package is deprecated

ngx-component-outlet

Best way to quickly use Dynamic Components with Angular

npm npm License Conventional Commits CircleCI Travis

GitHub contributors GitHub PR Stats GitHub Issue Stats

GitHub stars npm Downloads

Example Usage

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>

Comparison

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

Demo

Heroes

List of heroes

Table And Form

Table of heroes with table schema form

Editable Demo

Stackblitz

Github

Getting started

Step 1: Install ngx-component-outlet:
NPM
npm install --save ngx-component-outlet
Yarn
yarn add ngx-component-outlet
Step 2: Import the NgxComponentOutletModule:
import { NgxComponentOutletModule } from 'ngx-component-outlet';

@NgModule({
  declarations: [ AppComponent ],
  imports: [ NgxComponentOutletModule.forRoot() ],
  bootstrap: [ AppComponent ]
})
export class AppModule {}
Step 3: Create components that your want to use dynamically:
@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;
}
Step 4: Add components to declarations and entryComponents:
@NgModule({
    ...
    declarations: [ ..., CompAComponent, CompBComponent ],
    entryComponents: [ CompAComponent, CompBComponent ]
})
export class AppModule {}
Step 5: Create a host component with the same inputs/outputs:
@Component({
    selector: 'app-host-for-dynamic',
    template: ''
})
export class HostComponent {
    @Input() name: string;
}
Step 6: Add the component to declarations:
@NgModule({
    ...
    declarations: [ ..., HostComponent ],
    ...
})
export class AppModule {}
Step 7: Now show dynamic component in AppComponent:
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;
}
And you will have in AppModule:
import { NgxComponentOutletModule } from 'ngx-component-outlet';

@NgModule({
  imports:      [ NgxComponentOutletModule.forRoot() ],
  declarations: [ AppComponent, CompAComponent, CompBComponent, HostComponent ],
  entryComponents: [ CompAComponent, CompBComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule {}

API

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

Advanced Use Cases

Here is a demo repository showing ngx-component-outlet and Angular in action.

Keywords