我有一个案例,我在列表中动态创建组件(刷新很多)并使用 ngSwitch 像这样:

<div *ngFor='let item of items'>
   <div [ngSwitch]="item.view">
        <view-one *ngSwitchCase="'one'"></view-one>
        <view-two *ngSwitchCase="'two'"></view-two>
        <view-three *ngSwitchCase="'three'"></view-three>
    </div>
</div>

我想知道是否有更好更有效的方法来做到这一点,或者这是正确的方法吗?

我见过人们动态创建组件,但是 api 已经更改了很多次,很难知道什么是正确的。看来 ViewContainerRef.createComponent() 可能是另一种选择?

最佳答案

我更喜欢 createComponent() 而不是 ngSwitch 因为我认为它更容易测试和扩展。我还没有看到任何性能不足。

这是我当前方法的简化形式:

@Component({
    selector: "my-item",
    template: `
        <div #placeholder></div>
    `
})
export class MyItemComponent implements AfterViewInit {
    @Input() item: any;
    @ViewChild("placeholder", {read: ViewContainerRef}) placeholderRef: ViewContainerRef;

    constructor(
        private componentFactoryResolver: ComponentFactoryResolver) {
    }

    ngAfterViewInit() {
        switch(this.item.view) {
            case "one":
                this.loadItem(OneItemComponent);
            case "two":
                this.loadItem(TwoItemComponent);
            default:
                throw new Error("Unknown item!");
        }
    }

    private loadItem(component: Type<any>) {
        const factory = this.componentFactoryResolver.resolveComponentFactory(component);
        const componentRef = this.placeholderRef.createComponent(factory);
        componentRef.instance.item = this.item;
        componentRef.changeDetectorRef.detectChanges();
    }
}

现在您可以通过以下方式使用它:
<my-item *ngFor="let item of items" [item]="item"></my-item>

关于Angular 2 : ngSwitch or ViewContainerRef. createComponent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40794358/

10-10 20:15