Angular组件通信
头条创作挑战赛
本文同步本人掘金平台的文章:https:juejin。cnpost7084011213146816542
上一篇,我们讲了Angular结合NGZORRO快速开发。前端开发,很大程度上是组件化开发,永远离不开组件之间的通信。那么,在Angular开发中,其组件之间的通信是怎么样的呢?
举一反三,Vue和React中大同小异
本文纯文字,比较枯燥。因为控制台打印的东西比较鸡肋,所以就不配图了,嗯~希望读者跟着说明代码走一遍更容易吸收~1。父组件通过属性传递值给子组件
相当于你自定义了一个属性,通过组件的引入,将值传递给子组件。ShowyoutheCODE。!parent。component。htmlappchild复制代码
在父组件中调用子组件,这里命名一个parentProp的属性。child。component。tsimport{Component,OnInit,Input}fromangularcore;Component({selector:appchild,templateUrl:。child。component。html,styleUrls:〔。child。component。scss〕})exportclassChildComponentimplementsOnInit{输入装饰器Input()parentProp!:string;constructor(){}ngOnInit():void{}}复制代码
子组件接受父组件传入的变量parentProp,回填到页面。!child。component。htmlh1Hello!{{parentProp}}h1复制代码2。子组件通过Emitter事件传递信息给父组件
通过newEventEmitter()将子组件的数据传递给父组件。child。component。tsimport{Component,OnInit,Output,EventEmitter}fromangularcore;Component({selector:appchild,templateUrl:。child。component。html,styleUrls:〔。child。component。scss〕})exportclassChildComponentimplementsOnInit{输出装饰器Output()privatechildSayHinewEventEmitter()constructor(){}ngOnInit():void{this。childSayHi。emit(Myparents);}}复制代码
通过emit通知父组件,父组件对事件进行监听。parent。component。tsimport{Component,OnInit}fromangularcore;Component({selector:appcommunicate,templateUrl:。communicate。component。html,styleUrls:〔。communicate。component。scss〕})exportclassCommunicateComponentimplementsOnInit{publicmsg:stringconstructor(){}ngOnInit():void{}fromChild(data:string){这里使用异步setTimeout((){this。msgdata},50)}}复制代码
在父组件中,我们对child组件来的数据进行监听后,这里采用了setTimeout的异步操作。是因为我们在子组件中初始化后就进行了emit,这里的异步操作是防止RaceCondition竞争出错。
我们还得在组件中添加fromChild这个方法,如下:!parent。component。htmlh1Hello!{{msg}}h1appchild复制代码3。通过引用,父组件获取子组件的属性和方法
我们通过操纵引用的方式,获取子组件对象,然后对其属性和方法进行访问。
我们先设置子组件的演示内容:child。component。tsimport{Component,OnInit}fromangularcore;Component({selector:appchild,templateUrl:。child。component。html,styleUrls:〔。child。component。scss〕})exportclassChildComponentimplementsOnInit{子组件的属性publicchildMsg:stringProp:messagefromchildconstructor(){}ngOnInit():void{}子组件方法publicchildSayHi():void{console。log(Method:Iamyourchild。)}}复制代码
我们在父组件上设置子组件的引用标识childComponent:!parent。component。htmlappchild复制代码
之后在javascript文件上调用:import{Component,OnInit,ViewChild}fromangularcore;import{ChildComponent}from。componentschildchild。component;Component({selector:appcommunicate,templateUrl:。communicate。component。html,styleUrls:〔。communicate。component。scss〕})exportclassCommunicateComponentimplementsOnInit{ViewChild(childComponent)childComponent!:ChildComponent;constructor(){}ngOnInit():void{this。getChildPropAndMethod()}getChildPropAndMethod():void{setTimeout((){console。log(this。childComponent。childMsg);Prop:messagefromchildthis。childComponent。childSayHi();Method:Iamyourchild。},50)}}复制代码
这种方法有个限制,就是子属性的修饰符需要是public,当是protected或者private的时候,会报错。你可以将子组件的修饰符更改下尝试。报错的原因如下:
类型
使用范围
public
允许在累的内外被调用,作用范围最广
protected
允许在类内以及继承的子类中使用,作用范围适中
private
允许在类内部中使用,作用范围最窄4。通过service去变动
我们结合rxjs来演示。
rxjs是使用Observables的响应式编程的库,它使编写异步或基于回调的代码更容易。
后期会有一篇文章记录rxjs,敬请期待
我们先来创建一个名为parentandchild的服务。parentandchild。service。tsimport{Injectable}fromangularcore;import{BehaviorSubject,Observable}fromrxjs;BehaviorSubject有实时的作用,获取最新值Injectable({providedIn:root})exportclassParentAndChildService{privatesubject:BehaviorSubjectnewBehaviorSubject(null)constructor(){}将其变成可观察getMessage():Observable{returnthis。subject。asObservable()}setMessage(msg:string){this。subject。next(msg);}}复制代码
接着,我们在父子组件中引用,它们的信息是共享的。parent。component。tsimport{Component,OnDestroy,OnInit}fromangularcore;引入服务import{ParentAndChildService}fromsrcappservicesparentandchild。service;import{Subject}fromrxjsimport{takeUntil}fromrxjsoperatorsComponent({selector:appcommunicate,templateUrl:。communicate。component。html,styleUrls:〔。communicate。component。scss〕})exportclassCommunicateComponentimplementsOnInit,OnDestroy{unsubscribe:SubjectbooleannewSubject();constructor(privatereadonlyparentAndChildService:ParentAndChildService){}ngOnInit():void{this。parentAndChildService。getMessage()。pipe(takeUntil(this。unsubscribe))。subscribe({next:(msg:any){console。log(Parent:msg);刚进来打印Parent:null一秒后打印Parent:Jimmy}});setTimeout((){this。parentAndChildService。setMessage(Jimmy);},1000)}ngOnDestroy(){取消订阅this。unsubscribe。next(true);this。unsubscribe。complete();}}复制代码import{Component,OnInit}fromangularcore;import{ParentAndChildService}fromsrcappservicesparentandchild。service;Component({selector:appchild,templateUrl:。child。component。html,styleUrls:〔。child。component。scss〕})exportclassChildComponentimplementsOnInit{constructor(privateparentAndChildService:ParentAndChildService){}为了更好理解,这里我移除了父组件的SubjectngOnInit():void{this。parentAndChildService。getMessage()。subscribe({next:(msg:any){console。log(Child:msg);刚进来打印Child:null一秒后打印Child:Jimmy}})}}复制代码
在父组件中,我们一秒钟之后更改值。所以在父子组件中,一进来就会打印msg的初始值null,然后过了一秒钟之后,就会打印更改的值Jimmy。同理,如果你在子组件中对服务的信息,在子组件打印相关的值的同时,在父组件也会打印。
【完】
模芯制造从3周缩短至3天,3D打印技术为什么这么快?模铸法由制芯、制模、铸造三部分组成。第一阶段是最耗时的,制模的设计和组装过程中充满了挑战,同时要求制作者的手上功夫足够出色与细腻。但借助3D打印工艺,可以为模芯的制作提供一条捷……
沉默是金,用干净的灵魂,去洗涤世俗的尘埃面对近期巨大的压力我选择沉默不是因为害怕而是不屑压力人人有不必多言夜深睡不着的时候静静地坐在书房里翻几页书码几行字让……
无锡大桥坍塌!(无锡桥面侧翻事故调查报告!)无锡大桥坍塌!(无锡桥面侧翻事故调查报告!)2019年10月10日18时06分许,位于江苏省无锡市锡山区境内的312国道K135处发生一起桥面侧翻较大事故,共造成3人死亡……
AURALiC声韵AltairG2。1牵牛星流媒体播放器AURALiC声韵的产品型号很有意思,大多以星座来命名,例如Aries(白羊座)流媒体播放器、Vega(织女星)解码器、Leo(狮子座)超级时钟、Sirius(天狼星)DSD升……
卡贴机什么意思啊(什么是卡贴机)卡贴机什么意思啊(什么是卡贴机)卡贴机又叫做有锁机,要注意这里的有锁指网络锁,并不是ID锁。简单地说,卡贴机就是苹果与外国运营商合作的一种合约机,用户只需要支付少量……
兰州交大为什么不是211985?这几点原因不可忽略!快看看兰州大学基本代表甘肃省的最高峰大学,因为兰州是甘肃省的省会,集全省之力发展兰州,兰州是甘肃省其他城市的先头兵,兰州首先富裕了,兰州的教育事业不是百花齐放,兰州大学是兰州第一所大……
卡贴机什么意思啊(卡贴机什么)相信有不少想要买水货手机的朋友都会听说过卡贴机,卡贴机是什么意思,下面就为大家介绍一下。卡贴机是什么意思一、卡贴机指的是什么1、iPhone卡贴机,也就是二手……
来自辽朝的珍贵钱币文章来自中历收藏品鉴定中心,转载请说明!在我国历史上与北宋并存的少数民族政权,如辽、西夏、金等,他们在成立之初几乎都没有自已发行的货币,而无一例外,主要以五代十国或北宋钱……
俄军总参谋长西方搞挑衅最好想清楚,俄军使用核武器绝不会犹豫据俄罗斯媒体近日报道,在英国海军驱逐舰卫士号挑衅性闯入克里米亚半岛的12海里领海内遭俄军开火警告的事件发生后,俄罗斯武装力量总参谋长瓦列里格拉西莫夫对西方发出了最为严厉的警告,……
大学生英语(大学生用英语怎么说?)大学生英语(大学生用英语怎么说?)大学生用英语怎么说?大学生的英文翻译是什么?大学生undergraduate、collegestudent、universitys……
拥挤的用英语怎么说(拥挤的英文)拥挤的用英语怎么说(拥挤的英文)拥挤的英文:crowd。crowd作动词表示挤满;塞满;涌上;涌入;挤,靠近,挤在一旁。crowd词义及例句n。人群;观众;一……
亲爱的英文(用英语怎么说,亲爱的多种表示方法)亲爱的英文(用英语怎么说,亲爱的多种表示方法)亲爱的这个词你是不会经常对他她说呢?那么亲爱的用英语怎么说呢,有多少种表示方法呢?1。DearDear使用的范围比较广……
游客点4道菜花费近千元怀疑被宰旅游乱象如何整治近年来,从山东到黑龙江到云南到海南,不少游客被宰客的现象,频频被曝光。即算各级主管部门,进行了多轮专门整治,旅游宰客现象依然屡禁不止,几乎成为顽疾,极大损害了游客和消费者利益,……
学前班冬季育儿知识(冬季必备育儿常识)学前班冬季育儿知识(冬季必备育儿常识)冬天来了,又到了小孩容易生病的季节,所以冬季育儿一直是家长们关注点,今天,园助送上10条冬季育儿常识,家长可收藏哈1、别让孩子……
调研报告的格式(调查报告的写法教程)调研报告的格式(调查报告的写法教程)调查报告是反映对某个问题、某个事件或某方面情况调查研究所获得的成果的文章。它可以在报刊上发表,也可以供领导机关作为处理问题、制定政策的……
引力弱爆了,发生在眼前的物理现象,隐藏着深奥的科学道理日常生活中,水蒸气凝结成小水滴是非常常见的现象。尤其是新冠病毒爆发,很多人被迫戴上了口罩,眼镜结雾这个问题给我们带来很多的困扰。本文就与您探讨一下这个就发生在我们眼前奇妙过程的……
印度自称空军实力亚洲第一,40年坠机1000多架,谁给的勇气一艘所谓的国产航母印度可以造二十一年,一架国产飞机至今未出,纵然如此,依然挡不住印度碰瓷中国的步伐,奇葩印度奇葩事,尤其是这次疫情之后,无论印度做出多么离谱的事,恐怕咱们都能谈……
好听的铃声(好听的铃声)好听的铃声(好听的铃声)每个人的手机都有来电铃声,大部分人的来电铃声都是自己喜欢的歌曲。来电铃声成了手机里必不可少的东西,也会陪伴你很久很久。好听的手机来电铃声有哪些呢?……
多次屡教不改,惹怒多位正宫,遭导演太太团联名封杀拍摄门徒时候,剧组有一半的人请假,就连古天乐和吴彦祖,都想去厕所避风头,而这个女演员张静初,却贡献了教科书般的演技,张静初其实起点挺高的,但是她自己却错失无数次机遇,她想选择捷……
民愤难平!莫迪被骂上全印热搜,全球都在看笑话截止4月21日,印度累计确诊病例已有1560。9万例。目前印度国内一片混乱,连恒河火葬场的火葬费都开始接连涨价,平时不超过5000卢比的费用现在却要支付1。1万卢比。这使得印度……
汤姆汉克斯经典电影(千年老戏骨汤姆汉克斯电影榜单)汤姆汉克斯经典电影(千年老戏骨汤姆汉克斯电影榜单)爱Love榜单RSListBy陳凌希汤姆汉克斯主演的电影《邻里美好的一天》上映了,又是一部温情大作。回想起来……
老年人游戏(适合老人做的小游戏)老年人游戏(适合老人做的小游戏)社会活动理论认为,老年人保持较高的活动水平,积极参与社会生活,对防止老年人大脑退化具有良好的作用。游戏是一种健康、快乐的活动,是一种能达到……
中国护肤品品牌排名(国货护肤品排行榜)中国护肤品品牌排名(国货护肤品排行榜)护肤对于女生来讲就像吃饭睡觉一样重要,有很多女生会选择国外护肤品,认为国货总不如舶来品好用。但是,近些年国货护肤品的发展风生水起,不……
你还在为素三彩的鉴定而发愁吗?素三彩是明代中期以后创制的以黄、绿、紫三色的低温釉,因不用红彩,故以素字称为素三彩。在素三彩中黄釉是最主要的色釉,它是以铁为着色剂的彩釉,其色调深浅与色剂含量有关,釉的光泽与釉……