Note: given the semver adopted from now on by Angular team, I will refer to all versions of Angular2+ as Angular. For the old Angular 1.x, I will use AngularJs
In this post, we’ll take a look on how to dynamically inject a component into the DOM using a directive as a placeholder and ViewContainerRef Angular class.
For simplicity, we will declare a new Angular component that later will be dynamically added/removed to/from the DOM:
import { Component } from '@angular/core'; @Component({ selector: 'app-injected', templateUrl: `<div>Another component was added</div>`, styleUrls: ['./injected.component.css'] }) export class InjectedComponent { }
Then we declare the directive used as a placeholder on the DOM where we want to inject the new component:
import { Directive, ViewContainerRef } from '@angular/core'; @Directive({ selector: '[appInject]' }) export class InjectDirective { constructor(public viewContainerRef: ViewContainerRef) { } }
We add the directive on DOM in the place where the new component will be injected:
<div class="where_you_want_to_inject"> <ng-template appInject></ng-template> </div>
Finally, into the parent component, we add two functions, one who add the component, other who remove it:
import { Component, ViewChild, ComponentFactoryResolver } from '@angular/core'; import { InjectDirective } from '../inject.directive'; import { InjectedComponent } from '../injected/injected.component'; @Component({ selector: 'app-parent', templateUrl: './parent.component.html', styleUrls: ['./parent.component.css'] }) export class ParentComponent { @ViewChild(InjectDirective) injectComp: InjectDirective; constructor(private _componentFactoryResolver: ComponentFactoryResolver) { } public addComp() { const componentFactory = this._componentFactoryResolver.resolveComponentFactory(InjectedComponent); const viewContainerRef = this.injectComp.viewContainerRef; const componentRef = viewContainerRef.createComponent(componentFactory); } public removeComp() { const componentFactory = this._componentFactoryResolver.resolveComponentFactory(InjectedComponent); const viewContainerRef = this.injectComp.viewContainerRef; const componentRef = viewContainerRef.remove(); } }
This way we can dynamically add/remove components.
If you need an example, I added a working demo app on Github here.
If your company needs consulting on migration from Angular 1 to Angular 2/4/5 or training/update Angular knowledge, write me to contact@bogdancarpean.com
Hi,
Thank you very much you really made a great job