As the title says is there a way to programmatically render (into a DOM element) a component in angular?
For example, in React I can use ReactDOM.render
to turn a component into a DOM element. I am wondering if it's possible to something similar in Angular?
At first you'll need to have a template in your HTML file at the position where you'll want to place the dynamically loaded component.
<ng-template #placeholder></ng-template>
In the component you can inject the DynamicFactoryResolver
inside the constructor. Once you'll execute the loadComponent()
function, the DynamicComponent
will be visible in the template. DynamicComponent
can be whatever component you would like to display.
import { Component, VERSION, ComponentFactoryResolver, ViewChild, ElementRef, ViewContainerRef } from '@angular/core';
import { DynamicComponent } from './dynamic.component';
@Component({
selector: 'my-app',
templateUrl: './app.component.html'
})
export class AppComponent {
@ViewChild('placeholder', {read: ViewContainerRef})
private viewRef: ViewContainerRef;
constructor(private cfr: ComponentFactoryResolver) {}
loadComponent() {
this.viewRef.clear();
const componentFactory = this.cfr.resolveComponentFactory(DynamicComponent);
const componentRef = this.viewRef.createComponent(componentFactory);
}
}
Here is a Stackblitz.
What the loadComponent
function does is:
resolveComponentFactory
)createComponent
)componentRef
to, for example, modify public properties or trigger public functions of that components instance.