2019独角兽企业重金招聘Python工程师标准>>> hot3.png

动态创建组件的应用场景很多,比如动态广告、像浏览器一样动态打开多个页面等等等等

要动态创建组件主要需要用到angular中的ComponentFactoryResolver、ComponentFactory、ViewContainerRef、 ComponentRef这几个类

class ComponentFactoryResolver {static NULL: ComponentFactoryResolverresolveComponentFactory<T>(component: Type<T>): ComponentFactory<T>
}
class ViewContainerRef {get element(): ElementRefget injector(): Injectorget parentInjector(): Injectorclear(): voidget(index: number): ViewRef|nullget length(): numbercreateEmbeddedView<C>(templateRef: TemplateRef<C>, context?: C, index?: number): EmbeddedViewRef<C>createComponent<C>(componentFactory: ComponentFactory<C>, index?: number, injector?: Injector, projectableNodes?: any[][], ngModule?: NgModuleRef<any>): ComponentRef<C>insert(viewRef: ViewRef, index?: number): ViewRefmove(viewRef: ViewRef, currentIndex: number): ViewRefindexOf(viewRef: ViewRef): numberremove(index?: number): voiddetach(index?: number): ViewRef|null
}
class ComponentRef<C> {get location(): ElementRefget injector(): Injectorget instance(): Cget hostView(): ViewRefget changeDetectorRef(): ChangeDetectorRefget componentType(): Type<any>destroy(): voidonDestroy(callback: Function): void
}

假设我们要在组件A中动态创建组件B,那么我们一般会这样做:

1、在组件A中设置一个<ng-template>,并在组件类中获取它。

2、在组件A中导入组件B,导入上面说的那几个类

3、在组件A中动态创建组件B的方法里使用ComponentFactoryResolver的resolveComponentFactory方法解析组件B获得组件B的ComponentFactory,balabalabala...具体如下

4、在所在模块中导入entryComponents: [BComponent]

@NgModule({...declarations: [...,BComponent],entryComponents: [BComponent]
})
import { Component, OnInit, ViewChild, ComponentRef, ComponentFactory,ComponentFactoryResolver, ViewContainerRef } from '@angular/core';import { BComponent } from '../b/b.component';@Component({selector: 'app-article',template: `<ng-template #RefB></ng-template><button (click)="createComponent()">create</button> `
})
export class ArticleComponent implements OnInit {@ViewChild('RefB', { read: ViewContainerRef }) container: ViewContainerRef;constructor(private componentFactoryResolver: ComponentFactoryResolver) { }ngOnInit() {}createComponent() {const componentFactory: ComponentFactory<BComponent> = this.componentFactoryResolver.resolveComponentFactory(BComponent);const componentRef: ComponentRef<BComponent> = this.container.createComponent(componentFactory);}}

至此我们完成了对组件B的基本动态创建方法,我们还可以通过componentRef的instance方法来访问组件B中的属性和方法;

但是当我们不仅仅是希望能动态创建,同时还想要能让动态创建出的组件B能和组件A进行通讯,就需要使用@Input、@Output。这与平时我们所使用的过程有一点区别,因为动态创建出的组件无法绑定属性,则需要在父组件A通过订阅才能实现通讯。

//input
componentRef.instance.type = type;
//output
componentRef.instance.output.subscribe(event => console.log(event));

以前做过一个很复杂的的动态创建的组件交互中的Input需要使用Subject订阅才能实现的,记不清楚了具体是什么场景了,用来作甚么的了

转载于:https://my.oschina.net/u/3412211/blog/1550642

Angular组件--动态组件相关推荐

  1. angular使用动态组件后属性值_Angular动态加载组件

    引言 有时候需要根据URL来渲染不同组件,我所指的是在同一个URL地址中根据参数的变化显示不同的组件:这是利用Angular动态加载组件完成的,同时也会设法让这部分动态组件也支持AOT. 动态加载组件 ...

  2. angular使用动态组件后属性值_Angular 2-组件

    组件是Angular JS应用程序的逻辑代码.一个组件包括以下内容- 模板 -用于呈现应用程序的视图.它包含需要在应用程序中呈现的HTML.这部分还包括绑定和指令. 类 -这就像用C等任何语言定义的类 ...

  3. Vue之动态组件(二)

    Vue之第二篇章学习(动态组件.插槽.自定义指令) 1.动态组件 动态组件指的是:动态的切换组件的显示与隐藏 我们之前可以使用v-if来显示.隐藏组件,但是这样代码臃肿,冗余.我们这里用到Vue的内置 ...

  4. vue2.0中组建里面套用组件_vue19 组建 Vue.extend component、组件模版、动态组件 的实例代码...

    具体代码如下所示: document var aaa=vue.extend({//继承出来一个vue类aaa template:' 我是标题3 ' }); var a=new aaa();//a跟vm ...

  5. 【vue2】05_动态组件 插槽 自定义指令

    文章目录 动态组件 1. 什么是动态组件 2. 如何实现动态组件渲染 3. 使用 keep-alive 保持状态 4. keep-alive 对应的生命周期函数 5. keep-alive 的 inc ...

  6. 三、Vue(组件、组件间数据传递、slot内容分发、vue-router路由、单文件组件、vue-cli脚手架 )

    一. 组件component 1. 什么是组件?     组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码     组件是自定义元素(对象) ...

  7. [译] 关于 Angular 动态组件你需要知道的

    原文链接:Here is what you need to know about dynamic components in Angular 本文主要解释如何在 Angular 中动态创建组件(注:在 ...

  8. angular复用路由组件_Angular Router的组件路由简介

    angular复用路由组件 这是SitePoint Angular 2+教程的第4部分,有关如何使用Angular CLI创建CRUD应用程序. 在本文中,我们将介绍Angular Router,并了 ...

  9. 依赖注入和动态组件的WWH(What Why How)

    2019独角兽企业重金招聘Python工程师标准>>> 动态组件 问题1:动态组件和我们写的ngIf选择器有啥区别并且优势在哪里? 模板选择器直接实例化组件: 解释:根据已创建的组件 ...

最新文章

  1. 感悟Windows7
  2. Debug的T命令在执行修改寄存器SS 的指令时,下一条指令也紧接着被执行。
  3. 测试一些利用PYTHON完成中英文翻译的效果
  4. 超链接标签/<a>标签
  5. Android - 基于Toolbar的Navigation Drawer(Material Design)
  6. android plugin 镜像,cordova-plugin-screen-orientation
  7. win8经典开始菜单计算机,Win8.1/win8开始菜单工具大盘点
  8. Windows开机自动启动Virtual Box虚拟机(官方指南手册)
  9. 《那些年啊,那些事——一个程序员的奋斗史》——81
  10. NLP情感分析笔记(六):Transformer情感分析
  11. 手动方式安装 eclipse 的svn插件 Subversive和 Subversive SVN Connectors
  12. Java通过坐标点进行拟合函数
  13. centos journalctl日志查看
  14. Java 中文姓名随机生成
  15. isprime函数python_Python“函数”之我见
  16. 葡萄城报表模板库更新!新增物流行业特色模板
  17. EXCEL中发现不可读的内容。是否恢复此工作薄的内容?如果信任此工作薄的来源,请单击”是“
  18. MySQL 插入语句
  19. kindeditor 自定义上传图片
  20. springboot整合springsecurity安全框架(后端spring_security模块代码可直接使用,根据需求自定义修改)

热门文章

  1. Java 注解详解 (annotation)
  2. Spring - Java/J2EE Application Framework 应用框架 第 9 章 DAO支持
  3. 图像滤波 Image Filtering
  4. java服务端的 极光推送
  5. iOS一个灵活可扩展的开源Log库
  6. WPF绘制简单常用的Path
  7. 酷狗音乐在线试听下载
  8. Linux系统中软件的“四”种安装原理详解:源码包安装、RPM二进制安装、YUM在线安装、脚本安装包...
  9. 《树莓派开发实战(第2版)》——2.8 利用VNC远程控制树莓派
  10. 绑定线程到特定CPU处理器