Kullandığım Açısal Sürüm - Angular 4.2.0
Angular 4, bileşenleri çalışma zamanında yüklemek için ComponentFactoryResolver ile geldi . Bu, ihtiyaçlarınızı karşılayan Angular 1.0'daki $ compile ile aynı uygulamasıdır.
Aşağıdaki örnekte ImageWidget bileşenini DashboardTileComponent'e dinamik olarak yüklüyorum
Bir bileşeni yüklemek için , dinamik bileşeni yerleştirmeye yardımcı olacak ng-şablonuna uygulayabileceğiniz bir yönergeye ihtiyacınız vardır.
WidgetHostDirective
import { Directive, ViewContainerRef } from '@angular/core';
@Directive({
selector: '[widget-host]',
})
export class DashboardTileWidgetHostDirective {
constructor(public viewContainerRef: ViewContainerRef) {
}
}
bu yönerge , dinamik olarak eklenen bileşeni barındıracak öğenin görüntüleme kabına erişim sağlamak için ViewContainerRef'i enjekte eder .
DashboardTileComponent (Dinamik bileşeni oluşturmak için tutucu bileşeni yerleştirin)
Bu bileşen, bir üst bileşenden gelen bir girdiyi kabul eder veya uygulamanıza bağlı olarak hizmetinizden yükleyebilirsiniz. Bu bileşen, bileşenleri çalışma zamanında çözmek için önemli bir rol oynamaktadır. Bu yöntemde, sonuçta bir hizmetten bileşen adını yükleyen ve ComponentFactoryResolver ile çözümleyen ve son olarak verileri dinamik bileşene ayarlayan renderComponent () adlı bir yöntemi de görebilirsiniz .
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
Bu, dinamik olarak çözmek istediğiniz tüm bileşenleri kaydettirmek için bir hizmet fabrikasıdır
import { Injectable } from '@angular/core';
import { ImageTextWidgetComponent } from "../templates/ImageTextWidget.Component";
@Injectable()
export class WidgetComponentService {
getComponent(componentName:string) {
if(componentName==="ImageTextWidgetComponent"){
return ImageTextWidgetComponent
}
}
}
ImageTextWidgetComponent (çalışma zamanında yüklediğimiz bileşen)
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() { }
}
Ekle Sonunda bu ImageTextWidgetComponent öğesini uygulama modülünüze entryComponent olarak ekleyin
@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;
}
Blogumdan Orjinal Referans
Resmi Belgeler
Örnek Kaynak Kodunu İndirin