Versione angolare che ho usato - Angolare 4.2.0
Angular 4 ha creato ComponentFactoryResolver per caricare i componenti in fase di esecuzione. Questa è una specie della stessa implementazione di $ compile in Angular 1.0 che soddisfa le tue necessità
In questo esempio di seguito sto caricando dinamicamente il componente ImageWidget in un DashboardTileComponent
Per caricare un componente è necessaria una direttiva che è possibile applicare a ng-template che aiuterà a posizionare il componente dinamico
WidgetHostDirective
import { Directive, ViewContainerRef } from '@angular/core';
@Directive({
selector: '[widget-host]',
})
export class DashboardTileWidgetHostDirective {
constructor(public viewContainerRef: ViewContainerRef) {
}
}
questa direttiva inietta ViewContainerRef per ottenere l'accesso al contenitore della vista dell'elemento che ospiterà il componente aggiunto dinamicamente.
DashboardTileComponent (Posiziona il componente del supporto per renderizzare il componente dinamico)
Questo componente accetta un input proveniente da componenti principali oppure è possibile caricare dal servizio in base all'implementazione. Questo componente sta svolgendo il ruolo principale per risolvere i componenti in fase di esecuzione. In questo metodo puoi anche vedere un metodo chiamato renderComponent () che alla fine carica il nome del componente da un servizio e risolve con ComponentFactoryResolver e infine imposta i dati sul componente dinamico.
import { Component, Input, OnInit, AfterViewInit, ViewChild, ComponentFactoryResolver, OnDestroy } from '@angular/core';
import { DashboardTileWidgetHostDirective } from './DashbardWidgetHost.Directive';
import { TileModel } from './Tile.Model';
import { WidgetComponentService } from "./WidgetComponent.Service";
@Component({
selector: 'dashboard-tile',
templateUrl: 'app/tile/DashboardTile.Template.html'
})
export class DashboardTileComponent implements OnInit {
@Input() tile: any;
@ViewChild(DashboardTileWidgetHostDirective) widgetHost: DashboardTileWidgetHostDirective;
constructor(private _componentFactoryResolver: ComponentFactoryResolver,private widgetComponentService:WidgetComponentService) {
}
ngOnInit() {
}
ngAfterViewInit() {
this.renderComponents();
}
renderComponents() {
let component=this.widgetComponentService.getComponent(this.tile.componentName);
let componentFactory = this._componentFactoryResolver.resolveComponentFactory(component);
let viewContainerRef = this.widgetHost.viewContainerRef;
let componentRef = viewContainerRef.createComponent(componentFactory);
(<TileModel>componentRef.instance).data = this.tile;
}
}
DashboardTileComponent.html
<div class="col-md-2 col-lg-2 col-sm-2 col-default-margin col-default">
<ng-template widget-host></ng-template>
</div>
WidgetComponentService
Questa è una fabbrica di servizi per registrare tutti i componenti che si desidera risolvere in modo dinamico
import { Injectable } from '@angular/core';
import { ImageTextWidgetComponent } from "../templates/ImageTextWidget.Component";
@Injectable()
export class WidgetComponentService {
getComponent(componentName:string) {
if(componentName==="ImageTextWidgetComponent"){
return ImageTextWidgetComponent
}
}
}
ImageTextWidgetComponent (componente che stiamo caricando in fase di esecuzione)
import { Component, OnInit, Input } from '@angular/core';
@Component({
selector: 'dashboard-imagetextwidget',
templateUrl: 'app/templates/ImageTextWidget.html'
})
export class ImageTextWidgetComponent implements OnInit {
@Input() data: any;
constructor() { }
ngOnInit() { }
}
Aggiungi Infine aggiungi questo componente ImageTextWidgetComponent al modulo dell'app come entryComponent
@NgModule({
imports: [BrowserModule],
providers: [WidgetComponentService],
declarations: [
MainApplicationComponent,
DashboardHostComponent,
DashboardGroupComponent,
DashboardTileComponent,
DashboardTileWidgetHostDirective,
ImageTextWidgetComponent
],
exports: [],
entryComponents: [ImageTextWidgetComponent],
bootstrap: [MainApplicationComponent]
})
export class DashboardModule {
constructor() {
}
}
TileModel
export interface TileModel {
data: any;
}
Riferimento originale dal mio blog
Documentazione ufficiale
Scarica il codice sorgente di esempio