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

引言

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

动态加载组件

下面以一个Step组件为示例,完成一个3个步骤的示例展示,并且可以通过URL user?step=step-one 的变化显示第N个步骤的内容。

1、resolveComponentFactory

首先,还是需要先创建动态加载组件模块。

import { Component, Input, ViewContainerRef, ComponentFactoryResolver, OnDestroy, ComponentRef } from '@angular/core';

@Component({

selector: 'step',

template: ``

})

export class Step implements OnDestroy {

private currentComponent: ComponentRef;

constructor(private vcr: ViewContainerRef, private cfr: ComponentFactoryResolver) {}

@Input() set data(data: { component: any, inputs?: { [key: string]: any } } ) {

const compFactory = this.cfr.resolveComponentFactory(data.component);

const component = this.vcr.createComponent(compFactory);

if (data.inputs) {

for (let key in data.inputs) {

component.instance[key] = data.inputs[key];

}

}

this.destroy();

this.currentComponent = component;

}

destroy() {

if (this.currentComponent) {

this.currentComponent.destroy();

this.currentComponent = null;

}

}

ngOnDestroy(): void {

this.destroy();

}

}

抛开一销毁动作不谈的话,实际就两行代码:

let compFactory = this.cfr.resolveComponentFactory(this.comp);

利用 ComponentFactoryResolver 查找提供组件的 ComponentFactory,而后利用这个工厂来创建实际的组件。

this.compInstance = this.vcr.createComponent(compFactory);

这一切都非常简单。

而对于一些基本的参数,是直接对组件实例进行赋值。

for (let key in data.inputs) {

component.instance[key] = data.inputs[key];

}

最后,还需要告诉Angular AOT编译器为用户动态组件提供工厂注册,否则 ComponentFactoryResolver 会找不到它们,最简单就是利用 NgModule.entryComponents 进行注册。

@NgModule({

entryComponents: [ UserOneComponent, UserTwoComponent, UserThirdComponent ]

})

export class AppModule { }

但这样其实还是挺奇怪的,entryComponents 本身可能还会存在其他组件。而动态加载组件本身是一个通用性非常强,因此,把它封装成名曰 StepModule 挺有必要的,这样的话,就可以创建一种看起来更舒服的方式。

@NgModule({

declarations: [ Step ],

exports: [ Step ]

})

export class StepModule {

static withComponents(components: any) {

return {

ngModule: StepModule,

providers: [

{ provide: ANALYZE_FOR_ENTRY_COMPONENTS, useValue: components, multi: true }

]

}

}

}

通过利用 ANALYZE_FOR_ENTRY_COMPONENTS 将多个组件以更友好的方式动态注册至 entryComponents。

const COMPONENTS = [ ];

@NgModule({

declarations: [ ...COMPONENTS ],

imports: [

StepModule.withComponents([ ...COMPONENTS ])

]

})

export class AppModule { }

2、一个示例

有3个Step步骤的组件,分别为:

// user-one.component.ts

import { Component, OnDestroy, Input, Injector, EventEmitter, Output } from '@angular/core';

@Component({

selector: 'step-one',

template: `

Step One Component:params value: {{step}}

`

})

export class UserOneComponent implements OnDestroy {

private _step: string;

@Input()

set step(str: string) {

console.log('@Input step: ' + str);

this._step = str;

}

get step() {

return this._step;

}

ngOnInit() {

console.log('step one init');

}

ngOnDestroy(): void {

console.log('step one destroy');

}

}

user-two、user-third 略同,这里组件还需要进行注册:

const STEPCOMPONENTS = [ UserOneComponent, UserTwoComponent, UserThirdComponent ];

@NgModule({

declarations: [ ...STEPCOMPONENTS ],

imports: [

StepModule.withComponents([ ...STEPCOMPONENTS ])

]

})

export class AppModule { }

这里没有 entryComponents 字眼,而是为 StepModule 模块帮助我们动态注册。这样至少看起来更内聚一点,而且并不会与其他 entryComponents 在一起,待东西越多越不舒服。

最后,还需要 UserComponent 组件来维护步骤容器,会根据 URL 参数的变化,利用 StepComponent 组件动态加载相应组件。

@Component({

selector: 'user',

template: ``

})

export class UserComponent {

constructor(private route: ActivatedRoute) {}

stepComp: any;

ngOnInit() {

this.route.queryParams.subscribe(params => {

const step = params['step'] || 'step-one';

// 组件与参数对应表

const compMaps = {

'step-one': { component: UserOneComponent, inputs: { step: step } },

'step-two': { component: UserTwoComponent },

'step-third': { component: UserThirdComponent },

};

this.stepComp = compMaps[step];

});

}

}

非常简单的使用,而且又对AOT比较友好。

总结

文章里面一直都在提AOT,其实AOT是Angular为了提供速度与包大小而生的,按我们项目的经验来看至少在包的大小可以减少到 40% 以上。

当然,如果你是用angular cli开发,那么,当你进行 ng build --prod 的时候,默认就已经开启 AOT 编译模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分治2--取余运算

分治2--取余运算 一、心得 二、题目和分析 题目描述 输入b,p,k的值,求bp mod k的值。其中b,p,k*k为长整型数。输入 三个整数,分别为b,p,k的值输出 bp mod k样例输入 2 10 9样例输出 …

-mysql-锁机制分为表级锁和行级锁

2019独角兽企业重金招聘Python工程师标准>>> 声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 mysql锁机制分为表级锁和行级锁 …

tornado学习笔记day05-访问数据库

模板## 配置模板路径 这个在之前我们已经配置好了,可以参考前面的文章 settings {# 就像upfile就没有,你写了也白扯template_path: os.path.join(BASE_DIR, "templates"), }渲染并返回给客户端 使用render()方法 class HomeIndexHandler(RequestHandler):def ge…

pythonelectron桌面开发案例_使用Electron开发基于Node.js的桌面应用

最近小编在查看分享资料时,发现一个可以开发跨平台桌面应用的框架——NW.js(原名:node-webkit)。正当小编兴致勃勃的研究NW.js的时候,最基础的安装环节出了问题。无论用npm还是cnpm都无法完整下载所依赖的包(具体原因待考察)。鉴于此&#xf…

x264_param_t结构体参数分析

参考网上的一些资料,结合个人的理解,对x264中x264_param_t结构体作了初步的分析,不保证正确。对x264熟悉的朋友可以在这基础上修改添加typedef struct x264_param_t{/* CPU 标志位 */unsigned int cpu;int i_threads; /* 并行编…

知识点总结

1、把一个类转换成一个xml,首先,类名前需要加特性,[DataContract(Namespace "http://CYSoft.Services/AuthorizationObject")],[XmlRoot("Org")],里边的名字为根节点的名字,对各个属性…

tornado学习笔记day06-应用安全

应用安全 cookie 普通cookie 一般我们的用户表中都有啥呢 你在购物的时候,加入购物车,让你登录,那你登录之后,他怎么知道你登录了呢 token 这个值是随机的,存在cookie里面 设置 原型: 设置cookie 的方法 def set_cookie(self,name: str,value: Union[str, bytes],domai…

托福试卷真题_干货解答考生疑惑,自考真题考过了还会在出吗?

重视真题!重视真题!重视真题!重要的话要说三遍。想自考的你们一定要注意,对于历年真题,从来都是“备考必做”的态度。做自考真题,除了可以让自己尽快熟悉考试题型和考点外,还有什么好处呢&#…

x264 struct学习 1

x264_t 结构体维护着CODEC的诸多重要信息 其中成员frames是一个指示和控制帧编码过程的结构。其中current是已经准备就绪可以编码的帧,其类型已经确定;next是尚未确定类型的帧;unused用于回收不使用的frame结构体以备今后再次使用。 struct …

2016 ACM/ICPC Asia Regional Dalian Online

自己还是太菜,补题离不开题解。。。 但还是留个博客,万一以后忘了。。。 1001 Different Circle Permutation Polya定理,第一次遇见,学习了一下。不旋转的时候可以得到 f[i]f[i-1]f[i-2] 斐波那契数列,旋转后就可以通过…

tornado学习笔记day07-同步与异步

同步 概念 同步就是按部就班的依次执行我们的代码 进阶 但是有些情况我们有一些比较耗时的从操作,比如去别的地方拿点资源,去其他网站请求数据,去访问数据库,上传文件等等,所以这里面优点瑕疵,有小编一一道来 比如这样 本模块的功能:<同步异步demo># 这个就相等于一个…

关键字: on

关键字: on 数据库在通过连接两张或多张表来返回记录时&#xff0c;都会生成一张中间的临时表&#xff0c;然后再将这张临时表返回给用户。 在使用left jion时&#xff0c;on和where条件的区别如下&#xff1a; 1、 on条件是在生成临时表时使用的条件&#xff0c;它不管on中的条…

天融信安全接入客户端_天融信提示您警惕物联网设备Ripple20漏洞风险

近日&#xff0c;天融信阿尔法实验室在JSOF实验室发布的由Treck公司开发的TCP/IP软件库中获取到一系列0day漏洞。JSOF实验室发布的这批漏洞共计19个&#xff0c;被JSOF研究人员称为"Ripple20"。受此软件库影响的产品数量估计超过数亿&#xff0c;其中包括智能家居设备…

Service-Oriented Architecture,SOA(转)

http://blog.csdn.net/WOOSHN/article/details/8036910 介绍&#xff1a; IT体系结构已非常成熟&#xff0c;它是一种成功处理典型IT问题的方法。体系结构中一个受到很大重视且相对较新的分支是面向服务的体系结构(SOA)。SOA经常被吹捧为企业用于解决应用程序灵活性和高维护成本…

tornado学习笔记day08-tornado中的异步

概述 应为epoll主要用来解决网络的并发问题,所以tornado中的异步也是主要体现在网络的IO异步上,即异步web请求 tornado.httpclient.AsyncHTTPClient tornado提供异步web请求客户端,可以用来进行异步web请求, 这个客户端和服务端是相对来说的,当tornado的Handler去其他位置去…

GreenSock (TweenMax) 动画案例(二)

实现效果 动画分解 1.灯光闪烁2.文字出现3.水流4.心电图 知识点 1.AI(可尽情骚扰UI欧巴)2.SVG(了解基本的知识点)3.TweenMax(GreenSock)4.CSS animation 写在前面 写过第一篇文章后GreenSock (TweenMax) 动画案例(一)再回头看发现代码太多&#xff0c;根本没耐心去看完。所以每…

vue 用key拿对象value_利用 WeakMap 对 Vue 新建数组中的对象赋予 :key

需求在 Vue 中&#xff0c;对组件进行循环都需要加入key以便“就地复用”&#xff0c;可是在某些情况下&#xff0c;我们需要新建多个对象&#xff0c;而这些对象不是从后端获取到的&#xff0c;而是前端生成的&#xff0c;没有唯一值&#xff0c;且 Vue 目前版本只允许字符串&…

无限轮播图片的实现原理

无限轮播图相信是很多开发人员常用的一个功能&#xff0c;这里总结一下常用的两种方式的实现原理 一、使用UIScrollview实现无限轮播用UIScrollView实现&#xff0c;在scrollView上添加3个UIImageView&#xff0c;分别用来显示上一张图片&#xff0c;当前显示的图片&#xff0c…

开启 JM 的 trace 功能

[JM代码] 开启 JM 的 trace 功能本帖最后由 firstime 于 2009-6-15 11:16 AM 编辑 城里汉子说过&#xff1a; trace文件对分析码流结构很有效。我说的是trace文件&#xff0c;不是一步一步跟踪&#xff0c;就是编解码同时生成的 trace_enc.txt 这个文件&#xff0c;里面对每个比…

kafka入门介绍(转载)

Kafka作为一个分布式的流平台&#xff0c;这到底意味着什么&#xff1f; 我们认为&#xff0c;一个流处理平台具有三个关键能力&#xff1a; 发布和订阅消息&#xff08;流&#xff09;&#xff0c;在这方面&#xff0c;它类似于一个消息队列或企业消息系统。 以容错的方式存储…