Angular Version ที่ฉันใช้ - Angular 4.2.0
Angular 4 มาพร้อมกับComponentFactoryResolverเพื่อโหลดส่วนประกอบที่รันไทม์ นี่คือการใช้$ คอมไพล์แบบเดียวกัน ใน Angular 1.0 ซึ่งตอบสนองความต้องการของคุณ
ในตัวอย่างด้านล่างนี้ฉันกำลังโหลด คอมโพเนนต์ImageWidgetแบบไดนามิกในDashboardTileComponent
ในการโหลดส่วนประกอบคุณต้องมีคำสั่งที่คุณสามารถนำไปใช้กับng-template ซึ่งจะช่วยในการวางองค์ประกอบไดนามิก
WidgetHostDirective
import { Directive, ViewContainerRef } from '@angular/core';
@Directive({
selector: '[widget-host]',
})
export class DashboardTileWidgetHostDirective {
constructor(public viewContainerRef: ViewContainerRef) {
}
}
คำสั่งนี้ฉีดViewContainerRefเพื่อเข้าถึงคอนเทนเนอร์มุมมองขององค์ประกอบที่จะโฮสต์องค์ประกอบที่เพิ่มแบบไดนามิก
DashboardTileComponent (ส่วนประกอบตัวยึดตำแหน่งเพื่อแสดงผลองค์ประกอบแบบไดนามิก)
ส่วนประกอบนี้ยอมรับอินพุตที่มาจากส่วนประกอบหลักหรือคุณสามารถโหลดจากบริการของคุณตามการใช้งานของคุณ คอมโพเนนต์นี้ทำหน้าที่หลักในการแก้ไขคอมโพเนนต์ขณะรันไทม์ ในวิธีนี้คุณยังสามารถดูวิธีการที่ชื่อrenderComponent ()ซึ่งท้ายที่สุดจะโหลดชื่อส่วนประกอบจากบริการและแก้ไขด้วยComponentFactoryResolverและในที่สุดก็ตั้งค่าข้อมูลเป็นองค์ประกอบไดนามิก
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
นี่คือโรงงานบริการเพื่อลงทะเบียนส่วนประกอบทั้งหมดที่คุณต้องการแก้ไขแบบไดนามิก
import { Injectable } from '@angular/core';
import { ImageTextWidgetComponent } from "../templates/ImageTextWidget.Component";
@Injectable()
export class WidgetComponentService {
getComponent(componentName:string) {
if(componentName==="ImageTextWidgetComponent"){
return ImageTextWidgetComponent
}
}
}
ImageTextWidgetComponent (ส่วนประกอบที่เรากำลังโหลดที่รันไทม์)
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() { }
}
เพิ่มในที่สุดเพิ่ม ImageTextWidgetComponent ในโมดูลแอปของคุณเป็น entryComponent
@NgModule({
imports: [BrowserModule],
providers: [WidgetComponentService],
declarations: [
MainApplicationComponent,
DashboardHostComponent,
DashboardGroupComponent,
DashboardTileComponent,
DashboardTileWidgetHostDirective,
ImageTextWidgetComponent
],
exports: [],
entryComponents: [ImageTextWidgetComponent],
bootstrap: [MainApplicationComponent]
})
export class DashboardModule {
constructor() {
}
}
กระเบื้อง
export interface TileModel {
data: any;
}
การอ้างอิงดั้งเดิมจากบล็อกของฉัน
เอกสารอย่างเป็นทางการ
ดาวน์โหลดซอร์สโค้ดตัวอย่าง