范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Angular组件通信

  #头条创作挑战赛#
  本文同步本人掘金平台的文章:https://juejin.cn/post/7084011213146816542
  上一篇,我们讲了 Angular 结合 NG-ZORRO 快速开发。前端开发,很大程度上是组件化开发,永远离不开组件之间的通信。那么,在 Angular 开发中,其组件之间的通信是怎么样的呢?
  举一反三,Vue 和 React 中大同小异
  本文纯文字,比较枯燥。因为控制台打印的东西比较鸡肋,所以就不配图了,嗯~希望读者跟着说明代码走一遍更容易吸收~1. 父组件通过属性传递值给子组件
  相当于你自定义了一个属性,通过组件的引入,将值传递给子组件。Show you the CODE。   复制代码
  在父组件中调用子组件,这里命名一个 parentProp 的属性。// child.component.ts  import { Component, OnInit, Input } from "@angular/core";  @Component({   selector: "app-child",   templateUrl: "./child.component.html",   styleUrls: ["./child.component.scss"] }) export class ChildComponent implements OnInit {   // 输入装饰器   @Input()   parentProp!: string;    constructor() { }    ngOnInit(): void {   } } 复制代码
  子组件接受父组件传入的变量 parentProp,回填到页面。  

Hello! {{ parentProp }}

复制代码2. 子组件通过 Emitter 事件传递信息给父组件   通过 new EventEmitter() 将子组件的数据传递给父组件。// child.component.ts import { Component, OnInit, Output, EventEmitter } from "@angular/core"; @Component({ selector: "app-child", templateUrl: "./child.component.html", styleUrls: ["./child.component.scss"] }) export class ChildComponent implements OnInit { // 输出装饰器 @Output() private childSayHi = new EventEmitter() constructor() { } ngOnInit(): void { this.childSayHi.emit("My parents"); } } 复制代码   通过 emit 通知父组件,父组件对事件进行监听。// parent.component.ts import { Component, OnInit } from "@angular/core"; @Component({ selector: "app-communicate", templateUrl: "./communicate.component.html", styleUrls: ["./communicate.component.scss"] }) export class CommunicateComponent implements OnInit { public msg:string = "" constructor() { } ngOnInit(): void { } fromChild(data: string) { // 这里使用异步 setTimeout(() => { this.msg = data }, 50) } } 复制代码   在父组件中,我们对 child 组件来的数据进行监听后,这里采用了 setTimeout 的异步操作。是因为我们在子组件中初始化后就进行了 emit,这里的异步操作是防止 Race Condition 竞争出错。   我们还得在组件中添加 fromChild 这个方法,如下:

Hello! {{ msg }}

复制代码3. 通过引用,父组件获取子组件的属性和方法   我们通过操纵引用的方式,获取子组件对象,然后对其属性和方法进行访问。   我们先设置子组件的演示内容:// child.component.ts import { Component, OnInit } from "@angular/core"; @Component({ selector: "app-child", templateUrl: "./child.component.html", styleUrls: ["./child.component.scss"] }) export class ChildComponent implements OnInit { // 子组件的属性 public childMsg:string = "Prop: message from child" constructor() { } ngOnInit(): void { } // 子组件方法 public childSayHi(): void { console.log("Method: I am your child.") } } 复制代码   我们在父组件上设置子组件的引用标识 #childComponent: 复制代码   之后在 javascript 文件上调用:import { Component, OnInit, ViewChild } from "@angular/core"; import { ChildComponent } from "./components/child/child.component"; @Component({ selector: "app-communicate", templateUrl: "./communicate.component.html", styleUrls: ["./communicate.component.scss"] }) export class CommunicateComponent implements OnInit { @ViewChild("childComponent") childComponent!: ChildComponent; constructor() { } ngOnInit(): void { this.getChildPropAndMethod() } getChildPropAndMethod(): void { setTimeout(() => { console.log(this.childComponent.childMsg); // Prop: message from child this.childComponent.childSayHi(); // Method: I am your child. }, 50) } } 复制代码   这种方法有个限制,就是子属性的修饰符需要是 public,当是 protected 或者 private 的时候,会报错。你可以将子组件的修饰符更改下尝试。报错的原因如下:   类型   使用范围   public   允许在累的内外被调用,作用范围最广   protected   允许在类内以及继承的子类中使用,作用范围适中   private   允许在类内部中使用,作用范围最窄4. 通过 service 去变动   我们结合 rxjs 来演示。   rxjs 是使用 Observables 的响应式编程的库,它使编写异步或基于回调的代码更容易。   后期会有一篇文章记录 rxjs,敬请期待   我们先来创建一个名为 parent-and-child 的服务。// parent-and-child.service.ts import { Injectable } from "@angular/core"; import { BehaviorSubject, Observable } from "rxjs"; // BehaviorSubject 有实时的作用,获取最新值 @Injectable({ providedIn: "root" }) export class ParentAndChildService { private subject$: BehaviorSubject = new BehaviorSubject(null) constructor() { } // 将其变成可观察 getMessage(): Observable { return this.subject$.asObservable() } setMessage(msg: string) { this.subject$.next(msg); } } 复制代码   接着,我们在父子组件中引用,它们的信息是共享的。// parent.component.ts import { Component, OnDestroy, OnInit } from "@angular/core"; // 引入服务 import { ParentAndChildService } from "src/app/services/parent-and-child.service"; import { Subject } from "rxjs" import { takeUntil } from "rxjs/operators" @Component({ selector: "app-communicate", templateUrl: "./communicate.component.html", styleUrls: ["./communicate.component.scss"] }) export class CommunicateComponent implements OnInit, OnDestroy { unsubscribe$: Subject = new Subject(); constructor( private readonly parentAndChildService: 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 } from "@angular/core"; import { ParentAndChildService } from "src/app/services/parent-and-child.service"; @Component({ selector: "app-child", templateUrl: "./child.component.html", styleUrls: ["./child.component.scss"] }) export class ChildComponent implements OnInit { constructor( private parentAndChildService: ParentAndChildService ) { } // 为了更好理解,这里我移除了父组件的 Subject ngOnInit(): void { this.parentAndChildService.getMessage() .subscribe({ next: (msg: any) => { console.log("Child: "+msg); // 刚进来打印 Child: null // 一秒后打印 Child: Jimmy } }) } } 复制代码   在父组件中,我们一秒钟之后更改值。所以在父子组件中,一进来就会打印 msg 的初始值 null,然后过了一秒钟之后,就会打印更改的值 Jimmy。同理,如果你在子组件中对服务的信息,在子组件打印相关的值的同时,在父组件也会打印。   【完】✅

一呆公寓碧桂园森林湖店简介一呆公寓碧桂园森林湖店运营方为惠州一呆旅游开发有限公司永湖分公司,隶属于深圳一呆旅游集团。一呆公寓品牌,致力于酒店公寓托管运营,服务开发商,业主,游客,常年被评为国内公寓品牌影响力忆巴厘岛之行(2014)巴厘岛位于印尼,印尼主体信仰伊斯兰教,而巴厘岛却是个例外,这里的人基本上信仰印度教,这两种宗教的特点都是信得投入,每天都有几个仪式,不过但凡这样迷恋宗教的国家经济都不怎么样,想想也小窗口服务大民生宿迁市住房公积金管理中心创新发展工作综述之一编者按住房公积金制度是住房保障制度的重要组成部分,关系千家万户的民生福祉和社会和谐稳定。最近两年间,市住房公积金管理中心认真贯彻落实住房公积金管理条例,紧贴全市经济社会发展大局,聚女婴遭拒诊去世,这是医疗事故吗?晚上突然看到一条悲剧性的新闻,11月16日,河南李先生发文称,四个月大的女儿遭120拒诊后去世。据李先生称,女儿此前因血管瘤在郑州看病,出院后滞留郑州,11月12日他和女儿作为密接细说河南山西景点地盘之争作者说明本文内容仅为作者个人综合网络争议总结的个人观点,不代表本人就认同双方争议。编辑走遍太行文走遍太行在河南与山西的交界处,是横亘南北的太行山核心区。多年来,由于交通不便,又无法感情到最后,拼的是这两个字点上方听一禅第1953次和你说晚安文一禅主播一禅每个人在生命中会遇到谁,在前世就早有定数。在漫漫的轮回之路上,总会有那么一个人,看一眼就惊艳了余生。这一生所有的遇见,其实早已命中注心穷的人,最喜欢说这三种话有人说人穷不可怕,心穷才可怕。深以为然。心穷的人,总会认为自身能力不行,自己没有资格得到。结果,他们只能在自己的安全区里,徘徊不前。一个人的舞台有多大,不仅仅取决于他的能力,还取决单位上,越是人品差的人,越是有这样的表现人生总要经历风和雨,才能成长。和不同的人打交道,会得到不一样的结果。职场上更是要睁大双眼,识别同事的人品,虽然没有害人之心,但是不能没有防备心。在你顺势的时候,身边恭维你的,不见得冬天,离不开的驼色大衣,美到炸驼色不同于黑白灰的冷静自持,它不争不抢低调安静却又温柔内敛。在秋冬,它可以作为让人最放心的一抹底色,无论任何内搭任何裤装,都能轻松与之搭配。驼色大衣可以说是冬季不能缺少的一件单品,风衣67张昂老师!张小逸一脚刚迈进化妆间,眼神儿还没来得及把屋里的人扫一遍,从梳妆镜前凳子上弹起来的龚瑾一边抑扬顿挫的喊着人,一边喜出望外地迎了过来这是什么?刺绣的小金鱼?好精致!龚瑾几个概念追踪锂矿拍卖价续创历史新高抢锂大战进入白热化机构预计后续锂价还将进一步上涨(附概念股)智通财经APP获悉,11月16日下午,澳大利亚锂矿龙头PilbaraMinerals进行了新一轮锂精矿拍卖,竞价约为7,804美元吨,较Pilbara在2022年10月24日成交价
北京文化亮点电影从北京出品走向北京亮点根据灯塔专业版数据显示,在刚刚过去的2022年,全国电影总票房为300。67亿元,而北京则成为全年票房最高的城市,2022年度票房冠军长津湖之水门桥这部高质量高口碑的电影佳作也是北好消息,2023年我国将全面推进6G技术研发虽然目前包括华为联发科高通在内的多家公司均已经公布了WiFi7技术与解决方案,但国内仍延续5G网络规范。近日,从全国工业和信息化工作会议上获悉,到2023年我国将全面推进6G技术研预计2023年生猪价格波动小于2022年央视网消息在国家发展改革委今天(1月12日)举行的新闻发布会上,有关负责人表示,当前国内生猪产能总体处于合理区间,预计2023年价格波动幅度会比2022年小一些。受周期性季节性超预游国潮灯会,逛庙会大集,看全天候演艺,溢出屏幕的年味就在这!今年的春节,来得比往年更早一些陪伴了小伙伴三届的铜官庙会又要来啦2023年1月16日2月5日第四届铜官庙会过大年暨首届自贡国潮灯会喜庆来袭备受喜爱的铜官庙会搭配氛围感天花板的国潮灯vivox90pro上手体验,拍照没亮点,屏幕又拉胯?近两年,VIVO的影像实力得到了大家的一致认可,上一代VIVO旗舰X80PRO我使用了小半年,影像方面,我的体会是,有亮点也有不足,亮点是人像堪称一绝,夜景高光压制和眩光鬼影控制一再战高端?小米13Ultra或将年后上线,影像屏幕堆料惊人小米目前正不断冲击高端市场,MIX系列机型以及Ultra机型,在配置上越来越出色。其中,小米Ultra系列机型,为主打影像的旗舰手机,去年发布的小米12SUltra首发IMX989年货节购机首选华硕无畏系列,全能配置体验出众在今年CES2023上正式亮相的无畏Pro16新品,创新搭载3。2K120Hz裸眼3DOLED屏,在屏幕性能创作体验等多维度实现创新升级,对笔电产品有着高阶需求的创作者不容错过,对世纪大冤种,20小时换个随机史诗皮肤王者荣耀的人机觉悟已经开启了很长一段时间了,不知道各位有没有打够80局拿到皮肤宝箱,有没有开出自己想要的皮肤。我想说,如果你拿到了,那你就上大当了。那么下面就跟我来吐槽一下。首先就女子坐火车遇麻将车厢车厢改造过,还能K歌,是旅行社定制的旅游专列1月12日,据西部决策网报道,11日,在陕西西安,赵女士发视频,她坐火车出门游玩,车上居然有麻将车厢,让其觉得十分新奇。当事人赵女士称,这是当地多家旅行社专门定制的旅游专列,为了打游客打卡达古冰川感受大自然的原始魅力来源原创稿游客在海拔4860米处烤烧烤。达管局供图游客乘缆车到冰川。达管局供图近日,白雪皑皑的达古冰川景区迎来一批特殊的朋友春秋航空中粮可口可乐自嗨锅品胜户外电源美玉子成都咖啡指南防火于未燃!狮子山景区开展森林防火基础培训和应急演练为有效开展丽江古城2023年春节假日旅游接待工作,按照丽江市人民政府2023年森林防火命令的相关要求,营造安全管理,人人有责的氛围,提高职工森林防火意识,增强防灭火技能合理运用,有