在Angular中动态加载组件[重复]

Posted

技术标签:

【中文标题】在Angular中动态加载组件[重复]【英文标题】:Load component dynamically in Angular [duplicate] 【发布时间】:2020-04-17 09:28:23 【问题描述】:

我收到要在特定时间显示的所有组件,因此我正在对其进行迭代。 我已经尝试过,如下所示。我已经创建了允许使用的组件来自服务器的组件

      <ngb-tabset [activeId]="1">
        <ngb-tab id="i+1" title="dir.Name" *ngFor="let dir of DefaultDirectives;let i=index">
          <ng-template ngbTabContent>
            //Custom Component According to name of directive name in iteration
          </ng-template>
        </ngb-tab>
      </ngb-tabset>

例如,我有这个:

 DefaultDirectives:any[]=[
         Name:'First Directive',Directive:'app-dir1',
         Name:'Third Directive',Directive:'app-dir3',
       ]

我拥有所有这些组件

@Component(
  selector: 'app-dir1',
  templateUrl: './dir1.component.html', 
)
export class Dir1Component  
//Some Code




@Component(
  selector: 'app-dir2',
  templateUrl: './dir2.component.html', 
)
export class Dir2Component  
//Some Code




@Component(
  selector: 'app-dir3',
  templateUrl: './dir3.component.html', 
)
export class Dir3Component 
    //Some Code

【问题讨论】:

您应该了解组件和指令之间的区别。 angular.io/api/core/Directive 我该怎么做才能让它像这样调用组件我可以做 但我选择器是动态的@Reactgular 这里有很多不同的方法来做你想做的事。从开关到动态组件不等。看起来您想要动态,但ngSwitch 是最简单的(为什么要复杂化?)。无论如何,请阅读:angular.io/guide/dynamic-component-loader 因为有 20-30 种不同的模板我必须使用,通常 3-5 会在那里 如果我使用 switch case 代码会增加 【参考方案1】:

根据https://angular.io/guide/dynamic-component-loader中的解释,我曾经写过一个DynamicHost指令助手(在Angular 6项目中)

@Directive(
    selector: '[smaDynamicHost]',
)
export class DynamicHostDirective implements OnInit 
    @Input('smaDynamicHost') component: Type<any>;

    constructor(
        private componentFactoryResolver: ComponentFactoryResolver,
        private viewContainerRef: ViewContainerRef,
        private cdr: ChangeDetectorRef,
    ) 

    ngOnInit(): void 
        const componentFactory = this.componentFactoryResolver.resolveComponentFactory(
            this.component,
        );
        this.viewContainerRef.clear();
        this.viewContainerRef.createComponent(componentFactory);
        this.cdr.detectChanges();
    


使用该指令,您现在可以简单地传递要动态加载的组件的类型。用你的例子,它应该看起来像

<ng-template ngbTabContent [smaDynamicHost]="dir.Directive"></template>
 DefaultDirectives:any[]=[
    Name: 'First Directive', Directive: Dir1Component,
    Name: 'Third Directive', Directive: Dir3Component,
]

重要提示:您必须在 Angular 模块中将动态组件声明为 entryComponents

希望对你有帮助

【讨论】:

以上是关于在Angular中动态加载组件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在作为 innerHtml 加载的文档的子部分中动态加载 Angular 组件?

动态加载现有组件 Angular 2 Final Release

在 Angular 9 中动态加载 *ngFor 内的组件

在 Angular 中为动态加载的组件提供 @input

Angular - 动态加载选项卡名称和组件

Angular 2 动态组件加载 ngOnChanges 生命周期钩子调用