angular2 组件之间传值及事件传递

简介

angular2及以后的版本(包括angular4)都称为angular。组件之间的传值主要分为父子组件间传值和兄弟组件传值两大类,其中父子组件传值又分为父组件向子组件传值和子组件向父组件传值两种。

一、父组件向子组件传值
1.1 示例一

父组件中把roleName传给子组件使用


parent.ts
parent.html
child.ts
child.html

以上四步即完成了一个父组件向子组件传值的操作。

1.2 示例二:拦截输入属性

子组件可以拦截输入属性的数据并进行相应的处理,即使用setter拦截输入属性或ngOnChanges监听数据变化,这里仅示例setter的方式

child.ts
1.3 父组件通过局部变量获取子组件引用

在父组件的模板中为子组件创建一个局部变量,这个父组件可以通过这个局部变量来获得读取子组件公共成员变量和函数的权限;模板局部变量的作用域范围仅存在于定义该模板局部变量的子组件。

parent.ts
child.ts
1.4 父组件使用@ViewChild获取子组件的引用

由于模板局部变量只能在模板中使用,而不能直接在父组件类中使用,这有一定的局限性,这里介绍一种更优雅的数据传递方式---@ViewChild。
当父组件需要获取子组件中变量或者方法的读取权限时,可以通过@ViewChild注入的方式来实现,组件中ViewChild的作用是声明对子组件元素的实例引用,它提供了一个参数来选择将要引用的组件元素,这个参数可以是一个类的实例,也可以是一个字符串,它们实现的功能一样,只是表现形式不同,具体如下:

  • 参数为类实例,表示父组件将绑定一个指令或者子组件实例。
  • 参数为字符串类型,表示将起到选择器的作用,即相当于在父组件中绑定一个模板局部变量,获取到子组件的一份实例对象的引用。

1.41 下面是第一种参数类型(其中ContactCollectComponent是子组件):

parent.ts
  • 1.42 当参数为字符串时
    • 在父组件中引入ElementRef
      import { Component, OnInit, ElementRef } from '@angular/core';
    • 在父组件模版中自组件上加局部变量#xxxx
      <flex-search-bar-history #historysearch></flex-search-bar-history>
    • 在父组件类中如下操作
      @ViewChild('historysearch') historySearch: ElementRef;
    • 之后就可以在父组件中操作子组件的变量或方法类,比如
      this.historySearch['searchString'] = '';
二、子组件向父组件传值
2.1 示例一

子组件的输出属性onCollect传递给父组件,当父组件监测到子组件的onCollect动作时就会执行父组件中相应的方法,下面案例中同时父组件也把detail传给了子组件

child.ts
child.html
parent.html
parent.ts
2.2 示例二

子组件的联系人id传给父组件使用


child.html
child.ts
parent.html
parent.ts

父组件绑定的事件通过$event对象来访问num(即payload)的数据。

2.3 在子组件中获取父组件的引用
  • 已知父组件的类型
    这种情况可以直接通过在构造函数中注入ParentComponent来获取已知类型的父组件引用,示例代码如下:
child.ts
  • 未知父组件的类型
    一个组件可能是多个组件的子组件,有时候无法直接知道父组件的类型,在Angular中,可通过“类-接口”的方式来查找,即让父组件通过提供一个与“类-接口”标识同名的别名来协助查找。
    首先创建Parent抽象类,它只声明了name属性,没有实现(赋值),示例代码如下:
abstract

然后在ParentComponent组件的providers元数据中定义一个别名Provider,用useExisting来注入ParentComponent组件的实例,示例代码如下:

parentComponent.ts

通过下面的代码,在子组件中就可以通过Parent这个标识找到父组件的实例来,示例代码如下:

child.ts
三、兄弟组件间传值

利用单例服务可组件间共享数据:
@Injectable({ providedIn: 'root' })

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,605评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,939评论 25 707
  • 你相信听到的,还是看到的? 上个月刚换的工作,说是换也不是,就是回到了之前的公司上班了。按照我的性格来说,既然走了...
    事是拾阅读 119评论 0 6
  • day 58 第一章 Here Comes Charlie Only once a year, on his bi...
    123逍遥游阅读 455评论 0 1