美文网首页程序员
Angular 动态加载组件

Angular 动态加载组件

作者: 柳源居士 | 来源:发表于2018-11-19 23:01 被阅读57次

场景:
应用在运行期间加载一些新的组件。
用法:
锚点指令:

  1. 需要用锚点指令告诉angular 在哪里插入新组件。
    首先建立一个锚点指令,xx.directive.ts文件。并在构造方法里注入ViewContainerRef,来获取容器视图的访问权,这个容器就是那些动态加入的组件的宿主。指令文件的装饰器中包含一个指令名称,需要将其包含在需要显示的<ng-template ad-host> </ng-template>中。
 <ng-template ad-host> </ng-template>

<ng-template> 元素是动态加载组件的最佳选择,因为它不会渲染任何额外的输出。

import { Directive, ViewContainerRef } from '@angular/core';

@Directive({
  selector: '[ad-host]',
})
export class AdDirective {
  constructor(public viewContainerRef: ViewContainerRef) { }
}

ViewContainerRef来自于@angular/core.

  1. 传入组件数组
    传入组件数组,来动态加载传入的组件类,以及绑定到该组件上的任意数据。
    组件数组是一个对象接口,包含了组件类型以及该组件的数据:
import { Type } from '@angular/core';

export class AdItem {
  constructor(public component: Type<any>, public data: any) {}
}

需要引用ComponentFactoryResolver 。它会为每个组件解析出一个ComponentFactory,ComponentFactory又会为每个组件创建一个实例。

再使用viewContainerRef 的createComponent()方法,来返回一个component的引用。使用这个引用就可以与该组件进行交互,比如设置它的属性或调用它的方法。

loadComponent() {
    this.currentAdIndex = (this.currentAdIndex + 1) % this.ads.length;
    let adItem = this.ads[this.currentAdIndex];
    //解析出该组件的componentFactory ,adItem.component是一个组件类型
    let componentFactory = this.componentFactoryResolver.resolveComponentFactory(adItem.component);
    //adHost是锚点组件的引用
    let viewContainerRef = this.adHost.viewContainerRef;
    viewContainerRef.clear();
    //创建该动态组件的引用
    let componentRef = viewContainerRef.createComponent(componentFactory);
    //对该组件的属性赋值
    (<AdComponent>componentRef.instance).data = adItem.data;
  }

  1. 在@NgModule()里面声明entryComponents
    声明动态组件在entryComponents里:
    entryComponents:[动态组件1,动态组件2]

相关文章

  • Angular 动态加载组件

    场景:应用在运行期间加载一些新的组件。用法:锚点指令: 需要用锚点指令告诉angular 在哪里插入新组件。首先建...

  • Angular动态加载组件

    引言 有时候需要根据URL来渲染不同组件,我所指的是在同一个URL地址中根据参数的变化显示不同的组件;这是利用An...

  • Angular 动态组件加载

    1.首先定义一个辅助指令 辅助指令用来标记 动态组件 的插入点 2.定义需要动态插入的组件 3.定义Service...

  • Angular动态组件&响应式表单的实现[附源码]

    本文将通过一个简单的例子简单展示Angular动态组件+响应式表单的使用。【关键字】: Angular,动态组件,...

  • Angular中的动态组件加载

    看了Angular官网Hero教程中的动态组件一节,然后还看了一篇讲的不错的文章,结合自己的理解,总结Angula...

  • 深入Angular:组件(Component)动态加载

    Felt like the weight of the world was on my shoulders…Pre...

  • Angular4 动态加载组件杂谈

    最近接手了一个项目,客户提出了一个高大上的需求:要求只有一个主界面,所有组件通过Tab来显示。其实这个需求并不诡异...

  • 2018-08-30

    Angular4加载顺序 今天遇到了一个比较关于angular4加载组件顺序的坑,当我在app.component...

  • 挂载元素

    $mount el 以上挂载写法不会被组件当做子组件进行加载 3.动态组件,参考官方文档 动态组件

  • Angular 4 动态创建组件

    这篇文章我们将介绍在 Angular 中如何动态创建组件。 定义 AlertComponent 组件 首先,我们需...

网友评论

    本文标题:Angular 动态加载组件

    本文链接:https://www.haomeiwen.com/subject/thfifqtx.html