详解Angular动态组件

 更新时间:2021年05月21日 14:58:05   作者:Mila_媛儿  
本文主要介绍了Angular动态组件,对此感兴趣的同学,可以亲自实验一下。

使用场景

我们先明确下动态组件的使用场景,在代码运行时要动态加载组件,换成普通人话,代码需要根据具体情况(比如用户的操作,向后台请求结果)确定在某些地方加载某些组件,这些组件不是静态的(不是固定的)。

官网的举例就是,构建动态广告条,广告组件不断会推出新的,再用只支持静态组件结构的模板显然是不现实的。

再举一个常见的例子,动态弹出框,弹出的组件是不确定的、不断更新的,这里那里弹出个购买框,那那那又需要弹出样式选择框,静态组件结构模板是不能满足群众日渐增长的需求。

怎么实现

然后我们来找个把手,看实现动态组件需要什么。

一、动态组件放在哪

我们需要知道把动态组件加在哪里,也就是锚点。那什么东西可以用来加载组件呢?

你可能会想说,组件不就加载锚点上吗,锚点不就是DOM节点吗?那当然是加载DOM节点里啊。

我们先来回顾下Angular操作DOM的常见方法,原生JS操作DOM的方法你就不要想了,你觉得它能返回给你能加载Angular组件的对象吗?

Angular 提供了一种叫做 DOM Query 的技术,主要来源于 @ViewChild 和 @ViewChildren 装饰器(decorators),两者基本功能相同 。

@ViewChild: 返回单个引用,在视图的 DOM 中查找能匹配上该选择器的第一个元素或指令。

@ViewChildren :返回由 QueryList 对象包装好的多个引用,在视图的 DOM 中查找能匹配上该选择器的所有元素或指令。

基本语法:

@ViewChild([reference from template], {read: [reference type]});

DOM Query 的技术查找出来的对象分为三类:

ElementRef:如果它挂载的是类似 span 的简单 html 元素;

TemplateRef: 如果它挂载的是 template 元素;

ViewContainerRef: 无法推断,一般要程序员要在read中指明,任何DOM元素都可以被用作为视图容器。

我们通过官网查询API可以看到只有ViewContainerRef才是可以将一个或多个视图附着到组件中的容器,也就是只有它才可以加载组件。不过要注意的是,它是一个可以将新的组件作为其兄弟(节点)的DOM元素(容器),是兄弟,不是父子额。

好的,我们确定了使用ViewContainerRef来加载容器,获取ViewContainerRef有两种方式:

第一种就是上面的通过DOM Query查询@ViewChild获取

<ng-container #addComp></ng-container>
@ViewChild('addComp', {read: ViewContainerRef}) adComp:ViewContainerRef;

第二种就是官网里的例子,用依赖注入

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

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

锚点设置ng-template上,通过指令注入获取ViewContainerRef

template: `
<div class="ad-banner-example">
<h3>Advertisements</h3>
<ng-template ad-host></ng-template>
</div>

二、怎么获取组件的实例

组件加载到视图中去,不是简单一个new就实例化,再append、insert之类就能附加上去的就可以的。动态组件需要编译器事先编译存放好起来,再以ComponentFactory封装起来,之后的Component实例要通过ComponentFactory 来创建。大家可以看下这篇文章[译] 关于 Angular 动态组件你需要知道的,不过它提及的使用 SystemJsNgModuleLoader 模块加载器已经被淘汰了。

ComponentFactoryResolver一个简单的注册表,映射Components到ComponentFactory可用于创建组件实例的生成的类。它可用于获取给定组件类型的工厂,然后使用工厂的create()方法创建该类型的组件。

我们来看下官网实例代码,以下不是完整代码

//注入ComponentFactoryResolver
constructor(private componentFactoryResolver: ComponentFactoryResolver) { }
 
loadComponent() {
......
// 拿到可用于创建广告组件实例的生成的ComponentFactory
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(adItem.component);
 
//获取加载组件的容器
const viewContainerRef = this.adHost.viewContainerRef;
viewContainerRef.clear();
 
// 把组件放到容器里,再传一些参数给它
const componentRef = viewContainerRef.createComponent(componentFactory);
(<AdComponent>componentRef.instance).data = adItem.data;
}

你以为这就完了,你以为这样写出的代码就能运行吗?太年轻,让前浪来给你说一下要注意的几个点:

Angular 中的组件、指令、管道都是是被封装在模块中,以组件为例,如果要使用其别的模块组件,必须别的模块有export这个组件,而且你在自己模块也要import其他模块。所以官网例子的指令记得导入导出。

如果是动态组件,必须把组件注册在模块中 entryComponents 属性,但是就不用了export,import模块还是需要的。

以上就是详解Angular动态组件的详细内容,更多关于Angular动态组件的资料请关注脚本之家其它相关文章!

相关文章

  • Angular8基础应用之表单及其验证

    Angular8基础应用之表单及其验证

    这篇文章主要给大家介绍了关于Angular8基础应用之表单及其验证的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Angular8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • 仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件

    仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件

    这篇文章主要为大家详细介绍了仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件的相关资料,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • AngularJS HTML编译器介绍

    AngularJS HTML编译器介绍

    这篇文章主要介绍了AngularJS HTML编译器介绍,AngularJS的HTML编译器能让浏览器识别新的HTML语法。它能让你将行为关联到HTML元素或者属性上,甚至能让你创造具有自定义行为的新元素,需要的朋友可以参考下
    2014-12-12
  • AngularJS中的指令实践开发指南(二)

    AngularJS中的指令实践开发指南(二)

    这篇文章主要介绍了AngularJS中的指令实践指南(二)的相关资料,需要的朋友可以参考下
    2016-03-03
  • AngularJS国际化详解及示例代码

    AngularJS国际化详解及示例代码

    本文主要介绍AngularJS国际化的知识,这里整理了相关资料和示例代码以及实现效果图,有兴趣的小伙伴可以参考下
    2016-08-08
  • 详解如何在angular2中获取节点

    详解如何在angular2中获取节点

    本篇文章主要介绍了如何在angular2中获取节点,详细的介绍了几种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • 动手写一个angular版本的Message组件的方法

    动手写一个angular版本的Message组件的方法

    本篇文章主要介绍了动手写一个angular版本的Message组件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • monaco editor在Angular的使用详解

    monaco editor在Angular的使用详解

    这篇文章主要为大家介绍了monaco editor在Angular的使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • AngularJs bootstrap详解及示例代码

    AngularJs bootstrap详解及示例代码

    本文主要讲解AngularJs bootstrap,这里整理了详细的资料及简单示例代码帮助大家学习或者参考,有需要的小伙伴看下
    2016-09-09
  • AngularJS 自定义指令详解及示例代码

    AngularJS 自定义指令详解及示例代码

    本文主要介绍AngularJS 自定义指令,这里整理了基础资料及详细的示例代码及实现效果图,有需要的小伙伴可以参考下
    2016-08-08

最新评论