广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >详解Angular动态组件
  • 239
分享到

详解Angular动态组件

2024-04-02 19:04:59 239人浏览 安东尼
摘要

目录使用场景怎么实现一、动态组件放在哪二、怎么获取组件的实例使用场景 我们先明确下动态组件的使用场景,在代码运行时要动态加载组件,换成普通人话,代码需要根据具体情况(比如用户的操作,

使用场景

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

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

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

怎么实现

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

一、动态组件放在哪

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

你可能会想说,组件不就加载锚点上吗,锚点不就是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动态组件的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解Angular动态组件

本文链接: https://www.lsjlt.com/news/126532.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Angular动态组件
    目录使用场景怎么实现一、动态组件放在哪二、怎么获取组件的实例使用场景 我们先明确下动态组件的使用场景,在代码运行时要动态加载组件,换成普通人话,代码需要根据具体情况(比如用户的操作,...
    99+
    2022-11-12
  • vue.js 动态组件详解
    :is 动态组件 使用 v-bind:is=”组件名”,会自动去找匹配的组件名,如果没有,则不显示; <div id="app"> <test v-bi...
    99+
    2022-11-12
  • Angular动态组件的示例分析
    这篇文章主要介绍了Angular动态组件的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用场景我们先明确下动态组件的使用场景,在代码运行时要动态加载组件,换成普通人...
    99+
    2023-06-15
  • 详解Angular组件之投影
    目录概述一、简单例子1、子组件中使用<ng-content>指令来标记投影点2、父组件中把要投影到子组件的投影点的html片段写到子组件的标签中二、多个<ng-co...
    99+
    2022-11-12
  • vue components 动态组件详解
    目录总结总结数组发生变化时,动态加载相应数据 场景:点击不同组件名称,界面显示相应组件 步骤一:导入所需组件 步骤二:点击 tab 选项卡,将对应组件名添加进数组 步骤三:使用动态组...
    99+
    2022-11-12
  • vue3动态加载组件以及动态引入组件详解
    目录1.问题2.分析3.最后总结1.问题 在做一个用vite构建的vue3项目时,动态拉取导入.vue页面,然后控制台一直有以下提示,页面也无法渲染出来。 2.分析 根据上面的报错...
    99+
    2023-03-23
    vue 动态加载组件 vue加载组件 vue3动态加载组件
  • 详解Angular父子组件通讯
    目录概述一、输入输出属性概述二、输入属性三、属性绑定是单向的,从父组件到子组件四、输出属性1、先模拟一个实时变动的IBM的股票价格2、把信息输出出去,告诉组件外部,谁感兴趣谁来订阅3...
    99+
    2022-11-12
  • angular父子组件通信详解
    目录用到的api简单的例子person.ts父组件子组件效果总结用到的api Input - 子组件中定义可接受的属性,可以用来父组件给子组件传递数据 Output - 子组件中定义...
    99+
    2022-11-12
  • Angular如何根据组件名称动态创建组件
    这篇文章主要介绍Angular如何根据组件名称动态创建组件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、理解angular组件组件是一种特殊的指令,使用更简单的配置项来构建基于组...
    99+
    2022-10-19
  • vue3动态组件使用详解
    目录vue2vue3markRow:标记一个对象,使其不能成为一个响应式对象。toRaw:将响应式对象(由 reactive定义的响应式)转换为普通对象。shallowRef:只处理...
    99+
    2023-02-27
    vue3中动态组件 vue3动态加载组件 vue3动态添加组件
  • 详解Angular组件生命周期(一)
    目录概述一、钩子的调用顺序二、onChanges钩子三、变更检测机制和DoCheck()钩子概述 组件声明周期以及angular的变化发现机制 红色方法只执行一次。 变更检测执行的...
    99+
    2022-11-12
  • ComponentLoader 与动态组件实例详解
    目录引言按组件 ID 加载按组件树路径加载动态组件总结引言 组件通过 <Canvas /> 渲染在画布上,内容完全由组件树 componentTree 驱动,但也有一些情...
    99+
    2023-05-19
    ComponentLoader 动态组件 ComponentLoader
  • Vue动态组件和keep-alive组件实例详解
    目录动态组件格式注意点使用效果目录结构操作效果小结keep-alive组件使用背景解决方法使用keep-alive组件小结keep-alive组件-指定缓存语法注意:总结动态组件 多...
    99+
    2022-11-13
  • 详解Angular组件之中间人模式
    目录一、中间人模式二、例子1、报价组件上加购买按钮2、父组件接收处理事件3、下单组件4、运行结果三、使用服务作为中间人一、中间人模式 该组件树中除了组件1以外,每个组件都有一个父组...
    99+
    2022-11-12
  • 详解Angular组件之生命周期(二)
    目录一、view钩子1、实现ngAfterViewInit和ngAfterViewChecked钩子时注意事项2、在一个变更检测周期中禁止一个视图被组装好之后再去更新视图二、cont...
    99+
    2022-11-12
  • vue如何动态加载组件详解
    目录使用场景:需要动态导入组件的页面核心组件的代码:使用场景:总结使用场景: 项目中需要我们根据不同的业务需求呈现不同的业务场景,如果业务类型简单还好,直接全部引入判断即可,但随着我...
    99+
    2022-11-13
    vue 组件动态加载 vuejs动态加载组件 vue 加载组件
  • Vue动态组件与异步组件超详细讲解
    目录何为动态组件何为异步组件示例解析动态组件异步组件总结何为动态组件 动态组件是根据数据的变化,可以随时切换不同的组件,比如咱们现在要展示一个文本框和输入框,我们想要根据我们data...
    99+
    2023-03-19
    Vue动态组件与异步组件 Vue动态组件 Vue异步组件
  • 如何动态创建Angular组件实现popup弹窗功能
    这篇文章主要为大家展示了“如何动态创建Angular组件实现popup弹窗功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何动态创建Angular组件实现p...
    99+
    2022-10-19
  • C语言动态数组详解
    目录内存分配函数malloc calloc realloc free内存操作函数 memset memcpy memmove二维动态数组的建立和释放总结内存分配函数malloc ca...
    99+
    2022-11-12
  • Angular中怎么懒加载模块并动态显示它的组件
    本文小编为大家详细介绍“Angular中怎么懒加载模块并动态显示它的组件”,内容详细,步骤清晰,细节处理妥当,希望这篇“Angular中怎么懒加载模块并动态显示它的组件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作