Versi Sudut yang Saya Gunakan - Sudut 4.2.0
Angular 4 muncul dengan ComponentFactoryResolver untuk memuat komponen saat runtime. Ini adalah jenis implementasi yang sama dari $ compile di Angular 1.0 yang melayani kebutuhan Anda
Dalam contoh di bawah ini saya memuat komponen ImageWidget secara dinamis ke DashboardTileComponent
Untuk memuat komponen, Anda memerlukan arahan yang dapat Anda terapkan ke ng-template yang akan membantu menempatkan komponen dinamis
WidgetHostDirective
import { Directive, ViewContainerRef } from '@angular/core';
@Directive({
selector: '[widget-host]',
})
export class DashboardTileWidgetHostDirective {
constructor(public viewContainerRef: ViewContainerRef) {
}
}
arahan ini menyuntikkan ViewContainerRef untuk mendapatkan akses ke wadah tampilan elemen yang akan menjadi tuan rumah komponen yang ditambahkan secara dinamis.
DashboardTileComponent (Komponen dudukan untuk merender komponen dinamis)
Komponen ini menerima input yang berasal dari komponen induk atau Anda dapat memuat dari layanan Anda berdasarkan implementasi Anda. Komponen ini melakukan peran utama untuk menyelesaikan komponen saat runtime. Dalam metode ini Anda juga dapat melihat metode bernama renderComponent () yang akhirnya memuat nama komponen dari layanan dan menyelesaikannya dengan ComponentFactoryResolver dan akhirnya menyetel data ke komponen dinamis.
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
Ini adalah pabrik layanan untuk mendaftarkan semua komponen yang ingin Anda selesaikan secara dinamis
import { Injectable } from '@angular/core';
import { ImageTextWidgetComponent } from "../templates/ImageTextWidget.Component";
@Injectable()
export class WidgetComponentService {
getComponent(componentName:string) {
if(componentName==="ImageTextWidgetComponent"){
return ImageTextWidgetComponent
}
}
}
ImageTextWidgetComponent (komponen kami memuat saat runtime)
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() { }
}
Tambahkan Akhirnya tambahkan ImageTextWidgetComponent ini ke dalam modul aplikasi Anda sebagai 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;
}
Referensi Asli dari blog saya
Dokumentasi Resmi
Unduh Kode Sumber Sampel