美文网首页
如何动态的插入一个组件

如何动态的插入一个组件

作者: JamesSawyer | 来源:发表于2017-07-04 13:31 被阅读52次

主要用到的APIs有:

  • ViewChild: 装饰器,对组件视图内的元素进行查询,可以理解为jquery的选择器
  • ComponentRef:抽象类,组件引用,提供访问组件实例的接口和组件实例相关的其它对象,以及销毁组件实例的方法
  • ComponentFactory: 抽象类, 组件工厂,可以理解为创建组件的recipe, 内部有一个 create() 方法来创建组件
  • ComponentFactoryResolver: 抽象类,可当作服务注入, 这个有个 resolveComponentFactory() 返回一个 ComponentFactory
  • ViewContainerRef: 表示视图组件容器的引用
  • entryComponents: 这个用于声明动态注入的组件

示例

动态的创建一个AlertComponent组件

AlertComponnet:

import { Component, Input } from '@angular/core';

@Component({
  selector: 'app-selector',
  template: `
    <h1> alert {{ info }}</h1>
  `
})
export class AlertComponent {
  @Input() info: string = 'information'; // 输入属性
}

AppComponent

import {
  Component,
  ComponentRef,
  ComponentFactory,
  ComponentFactoryResolver,
  ViewChild,
  ViewContainerRef,
  OnDestroy
} from '@angular/core';
import { AlertComponent } from './alert.component';

@Component({
  selector: 'app-root',
  template: `
    <div>
      <ng-template #alertContainer></ng-template> // 这里放动态生产的AlertComponent组件
      <button (click)="createAlert('success')">创建成功alert组件</button>
      <button (click)="createAlert('warning')">创建警告alert组件</button>
    </div>
  `
})
export class AppComponent implements OnDestroy {
  // 查找到 <ng-template> 元素
  // { read: ViewContainerRef }) 表示将这个元素(<ng-template>)当作视图容器的引用
  @ViewChild('alertContainer', { read: ViewContainerRef }) container: ViewContainerRef; 
  componentRef: ComponentRef<AlertComponent>; // 表示对AlertComponent组件的引用

  constructor(
    // ComponentFactoryResolver 暴露一个重要的方法 'resolveComponentFactory'
    // 'resolveComponentFactory()' 接收一个组件当作参数, 返回一个 ComponentFactory
    private resolver: ComponentFactoryResolver // 注入这个服务
  ){}

  createAlert(msg) {
   this.container.clear(); // 表示一上来先清空视图容器
    // 创建组件工厂
   const factory: ComponentFactory<AlertComponent> = this.resolver.resolveComponentFactory(AlertComponent);
    // 动态的创建该组件
    // createComponent() 内部其实是调用factory内部的create()方法
    this.componentRef = this.container.createComponent(factory);
    // this.componentRef.instance 表示 组件实例
    this.componentRef.instance.info = msg;
  }

  ngOnDestroy(): void {
    this.componentRef.destroy(); // 最后别忘记了销毁该组件
  }
}

上面的过程详解:

// 这个表示将容器清空
// 如果不清空的话,创建的组件将不停的添加到视图容器中(如果这是你想要的效果,可以不必调用这个方法)
this.container.clear(); 

最后将动态插入的组件添加到 entryComponents 中:

import { AppComponent } from './app.component';
import { AlertComponent } from './components/alert/alert.component';
@NgModule({
  declarations: [
    AppComponent,
    AlertComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule
  ],
  entryComponents: [AlertComponent], // 动态创建的组件
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {
}

最后效果如图:


动态创建组件.png

参考文章:

相关文章

  • Angular 动态组件加载

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

  • 如何动态的插入一个组件

    主要用到的APIs有: ViewChild: 装饰器,对组件视图内的元素进行查询,可以理解为jquery的选择器 ...

  • Vue动态组件

    1、什么是动态组件? 动态组件指的是动态切换组件的显示与隐藏 2、如何实现动态组件渲染? vue提供了一个内置的<...

  • 在.vue文件中插入一个动态编辑的组件

    工作中有个需求,做一个动态组件,也就是组件代码由客户书写,然后生成页面,所以,就需要将动态书写的组件插入到页面中,...

  • vue-动态组件

    1. 什么是动态组件 动态组件指的是动态切换组件的显示与隐藏。 2. 如何实现动态组件渲染 vue 提供了一个内置...

  • vue的动态组件 keep-alive

    1. 什么是动态组件 动态组件指的是 动态切换组件的显示与隐藏 2. 如何实现动态组件渲染 vue提供了一个内置的...

  • vue动态组件

    引入组件,注册组件 用component标签插入组件,用is来指向组件名称,:is来动态改变组件名称 用按钮操作组...

  • iview 通过render函数渲染生成的input输入框实现双

    问题:iview中表格组件通过render函数动态生成Input组件输入框插入表格中,动态生成的Input输入框组...

  • 【Vue】v-for要提供唯一key属性

    最近在项目中,用了v-for来动态添加组件,然后删除中间的组件时,删除掉的都是最后一个组件,插入顺序也很奇怪。 后...

  • 动态组件

    首先,使用一个组件的顺序:导入==>注册==>使用如何使用动态组件? 这样可以对is属性进行动态绑定v-bind...

网友评论

      本文标题:如何动态的插入一个组件

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