本文来自于华为云云岭团队屈金雄同学的分享,通过对比几种Angular组件间的通信方式,给大家介绍了一种新的Angular组件间通信的解决方案。其中首创了公共的dataService,用于任意组件间通信。 dataService通过angular service特性和注册表的使用,可以实现消息的一收一发,无需再写单独的service逻辑。
(相关资料图)
一般来讲,Angular 已有的组件间通信方式有哪些?
序号通信方式描述1输入属性(@Input)通过属性绑定,将数据从父组件传递给子组件。2输出属性(@Output)通过事件绑定,子组件可以发送事件给父组件,并传递数据。3父子组件直接访问在某些情况下,父组件可以通过 ViewChild 或 ContentChild 装饰器直接访问子组件或模板中的元素。4服务(Service)创建共享的服务,组件可以注入该服务来存储和获取数据。5RxJS Subject 和 Observable使用 RxJS 中的 Subject 和 Observable 来实现组件之间的消息传递。6Angular 路由参数通过路由参数在不同组件之间传递数据。7NgRx使用 NgRx 状态管理库来实现更复杂的组件间通信和数据共享。
但以上方法各有局限性,要么代码繁多,要么学习成本高,尤其是跨越多个组件的通信,例如下图中从组件D
到组件G
,用前两种方式就太繁琐了,方式 4 和 5 可能是常用解决方案,但是仍然有些繁琐——需要为每一组消息传递写专有的 service 代码。
本文介绍的通信方式是在方式 4 和 5 的基础上,进行了做了特殊的抽象处理,实现了一个公共的 dataService,最终实现了消息一收一发,无需再写中间环节的代码。
为了做对比,这里先介绍一下前文所示的方式4+5
方案,这个方案通过 service 和 rxjs 的 subject 结合使用,实现任意组件间通信。
首先,我们创建一个名为MessageService
的服务,用于在组件之间传递消息:
接下来,我们有两个组件,SenderComponent
和ReceiverComponent
。SenderComponent
用于发送消息,而ReceiverComponent
用于接收消息。
在这个示例中,我们通过MessageService
来实现了SenderComponent
向ReceiverComponent
发送消息的功能。MessageService
中使用了 RxJS 的Subject
来创建一个可观察的消息流,然后在SenderComponent
中调用sendMessage
方法来发送消息,而在ReceiverComponent
中使用subscribe
来订阅消息流并接收消息。
请注意,为了使MessageService
成为全局可用的单例服务,我们在@Injectable
装饰器中设置了providedIn: 'root'
。这样一来,MessageService
将成为整个应用程序中所有组件共享的单一实例。
为了使示例正常工作,别忘了将SenderComponent
和ReceiverComponent
添加到所属的模块中,并在模块的模板中放置对应的组件选择器。
这样,SenderComponent
发送的消息将通过MessageService
传递给ReceiverComponent
,并显示在ReceiverComponent
中。这就完成了通过 Service 和 RxJS 的 Subject 实现组件间消息通信的示例。
理解本方案,默认需要熟悉 Angular 的 service 存储传递数据原理 和 rxjs 的多播用法。
本方案原理是,通过 service 单例的特性(service 在模块内组件间是共享的)和 Subject 的多播特性,实现一个公共的 service,通过公共的 service 实现数据传递。相对的,如同前文中的文件所示,开发者需要为每一组通信单独创建 service 文件,单独写响应的逻辑。
理解本方案的三个关键点:
单例 通过在
@Injectable
装饰器中设置providedIn: 'root'
,service 成为整个应用程序中所有组件共享的单一实例。因为是共享的,所以能作为通信中消息的载体。这是本方案的根本前提。rxjs 的多播 基础原理是观察者模式(即发布订阅模式)
注册表 为了复用 service,简化代码,本方案引入了一个注册表,用来存储对应每个消息事件的 Subject 对象。Subject 对象在创建监听时(需要接收消息的地方)创建。
service 代码如下:
使用时只需引入上面的公共 dataService,然后以如下示例的方式直接调用 api 就行。
创建监听的示例:
发送消息的示例:
以下是一个使用上文提供的DataService
实现组件间消息通信的示例:
假设我们有两个组件:SenderComponent
和ReceiverComponent
,它们需要通过DataService
来传递消息。
在这个示例中,我们通过DataService
实现了SenderComponent
向ReceiverComponent
发送消息的功能。DataService
的sendMessage
方法用于发送消息,而getListener
方法用于订阅消息,并在接收到消息时更新ReceiverComponent
中的receivedMessage
属性。cancelSubscription
方法用于取消订阅,并在不再有监听者时从注册表中移除监听器。
请确保将SenderComponent
和ReceiverComponent
添加到所属的模块中,并在模块的模板中放置对应的组件选择器。
通过使用DataService
,SenderComponent
发送的消息将传递给ReceiverComponent
,并显示在ReceiverComponent
中。这样,我们成功地实现了组件间消息通信。
后续可以做成插件,以装饰器的形式调用。
以上就是 屈金雄 同学的分享,如果你也有更多前端技术想与我们交流,欢迎投稿。除此之外,也欢迎你参与到 OpenTiny 开源中来,一起共建项目,一起研讨前端技术。
OpenTiny 是一套企业级组件库解决方案,适配 PC 端 / 移动端等多端,涵盖 Vue2 / Vue3 / Angular 多技术栈,拥有主题配置系统 / 中后台模板 / CLI 命令行等效率提升工具,可帮助开发者高效开发 Web 应用。
核心亮点:
跨端跨框架
:使用 Renderless 无渲染组件设计架构,实现了一套代码同时支持 Vue2 / Vue3,PC / Mobile 端,并支持函数级别的逻辑定制和全模板替换,灵活性好、二次开发能力强。
组件丰富
:PC 端有80+组件,移动端有30+组件,包含高频组件 Table、Tree、Select 等,内置虚拟滚动,保证大数据场景下的流畅体验,除了业界常见组件之外,我们还提供了一些独有的特色组件,如:Split 面板分割器、IpAddress IP地址输入框、Calendar 日历、Crop 图片裁切等
配置式组件
:组件支持模板式和配置式两种使用方式,适合低代码平台,目前团队已经将 OpenTiny 集成到内部的低代码平台,针对低码平台做了大量优化
周边生态齐全
:提供了基于 Angular + TypeScript 的 TinyNG 组件库,提供包含 10+ 实用功能、20+ 典型页面的 TinyPro 中后台模板,提供覆盖前端开发全流程的 TinyCLI 工程化工具,提供强大的在线主题配置平台 TinyTheme
联系我们:
官方公众号:OpenTiny
OpenTiny 官网:/
OpenTiny 代码仓库:/opentiny/
Vue 组件库:/opentiny/tiny-vue (欢迎 Star)
Angluar组件库:/opentiny/ng (欢迎 Star)
CLI工具:/opentiny/tiny-cli (欢迎 Star)
更多视频内容也可以关注OpenTiny社区,B站/抖音/小红书/视频号。
本文来自于华为云云岭团队屈金雄同学的分享,通过对比几种Angular组件
最近,全球最美、最有钱的女演员之一索菲亚SofiaVergara惊曝离婚消息,
新华社洛杉矶8月14日电(记者谭晶晶)美国航天局14日公布的最新分析显
再见!我早有预感,不送走好!最近一月总浮现那些喜欢过、爱过就不见的
中新网8月14日电综合外媒报道,当地时间13日夜间,位于意大利西西里岛
8月14日,陕西黑猫(601015)融资买入97 59万元,融资偿还142 32万元,
格隆汇8月15日丨望尘科技控股(02458 HK)公布,基于对集团截至2023年6月
今天佳肖财经网就给我们广大朋友来聊聊600160,以下关于6001600中国铝业
8月14日水利板块较上一交易日上涨0 81%,新疆交建领涨。当日上证指数报
周一盘中,欧元 美元报1 0941,跌幅0 06%。今日分析:在1 0925之上,看
“近年来,生成式AI应用爆发,越来越多的投资人关注生成式AI,也就...
上半年,我国经济呈现回升向好态势。进入暑期,云南各地再现“人从...
“叔叔,这是送给你的清凉礼包,谢谢您每天保障大家的出行。”“谢...
据清廉吴中消息:苏州市吴中区金庭镇个体建筑商马国强涉嫌行贿罪,目前
最近,有一个男子在湖南益阳市游泳的视频,在网上被网友疯传。很多网友
证券时报e公司讯,企查查APP显示,天津云从天开人工智能科技有限公司成
据贵阳市纪委监委消息:贵阳市第一人民医院原党委副书记、院长张云
天眼查App显示,近日,荣耀终端有限公司申请“MagicAl”商标,国际...
8月14日,全球第三大评级机构惠誉评级发布的研报指出,由于在7月至8
江苏连云港一工厂氢气泄漏引发火情,附近居民深夜被疏散---极目新闻记
“秋天的第一个爆款”来了:栀子!古茗的云雾栀子青,2天售出100万...
宠物食品概念股有哪些,主要利好哪些股票?(2023 8 14),南方财富网为
每日甘肃网8月14日讯据民族日报报道(记者马进忠)8月11日,经过6天的
格隆汇8月14日丨有投资者向东方盛虹(000301 SZ)提问:公司二季度炼化产
核心观点:11日国内钢材指数(Myspic)综合指数报收143 35点,周环比下
8月11日,英诺激光(301021)融资买入214 33万元,融资偿还344 07万元
巴媒:内马尔将加盟利雅得新月,转会费约9000万欧&年薪1亿欧,新月,巴媒
三叶草生物B2197HK跳空高开15报115港元市值1488亿港元公司发布盈喜公告
海外网8月14日电 据伊朗英语电视台(Press TV)13日报道,叙利亚1
创新引领,创业筑梦。8月10日、11日,为期2天的第12届中国创新创业大赛