angular组件间通讯的实现方法示例


Posted in Javascript onMay 07, 2020

前言

一个Angular应用一般情况下包含多个组件,而且要让组件互相之间能进行通讯(数据传送),这样才能构成一个有机的完整系统。

1、情景引入

下面例举一个实际遇到的情况:

angular组件间通讯的实现方法示例

上图页面包含两个组件,“新增班级组件”和“选择教师组件”,在新增班级时需要选择改班级的管理教师,管理教师列表要从数据库中获取。选择好教师后,“选择教师组件”要把选择的教师对象传递回“新增班级组件”,这其中涉及到对象传递称为通讯。

2、组件关系

组件之间有几种典型的关系:父子关系、兄弟关系、没有直接关系

angular组件间通讯的实现方法示例

父子关系说明:有A、B两个组件(不一定在同一个模块),如果A组件的view页面中引用了B的selector标签,则称A为B的父组件,或B为A的子组件。

3、通讯方案

了解完组件存在的关系,相应地,组件之间有以下几种典型的通讯方案:

  • 直接的父子关系:父组件直接访问子组件的 public 属性和方法
  • 直接的父子关系:借助于 @Input 和 @Output 进行通讯
  • 没有直接关系:借助于 Service 单例进行通讯
  • 利用 cookie 和 localstorage 进行通讯
  • 利用 session 进行通讯

直接调用

假设BComponent是AComponent的子组件。

对于有直接父子关系的组件,父组件可以直接访问子组件里面 public 型的属性和方法,示例代码片段如下:

<B #child></B> 
<button (click)="child.childFunction()">调用子组件方法</button>

显然,子组件B里面必须暴露一个 public 型的 childFunction 方法,就像这样:

public childFunction():void{ console.log("子组件的名字是"); }

以上是通过在模板里面定义局部变量的方式来直接调用子组件里面的 public 型方法。在父组件的内部也可以访问到子组件的实例,需要利用到 @ViewChild 注解,示例如下:

@ViewChild(BComponent)
private bComponent: BComponent;

如果通过 @ViewChild 注解,父组件直接访问子组件,那么两个组件之间的关系就被固定死了。父子两个组件紧密依赖,谁也离不开谁,不能单独使用了。尽量避免这样做。

@Input 和 @Output

同样假设BComponent是AComponent的子组件。

我们可以利用 @Input 装饰器,让父组件直接给子组件传递参数,子组件BComponent上这样写:

@Input() 
public title:string;

父组件view上可以这样设置 title 这个参数(这个参数可以是个父组件想要传给子组件的变量或对象等):

<B title="Hello Angular"></B>

前面是父组件->子组件传递数据,过程相对简单,下面是子组件->父组件传数据,过程较复杂。

@Output 的本质是事件机制,我们可以利用它来监听子组件上派发的事件,子组件上这样写:

@Output() 
public selected=new EventEmitter<要传给父组件的对象类型>();

EventEmitter:在angular中组件通过定义EventEmitter 事件弹射器的方式由子组件向父组件发送数据。

selected是一个事件,触发 selected 事件的方式如下:

this.selected.emit(对象);

在子组件上定义一个方法onChange(),使子组件view能够调用该方法触发 selected 事件:

onChange() { 
 this.selected.emit(要传给父组件的对象); 
}

父组件可以这样监听selected事件:

<B (selected)➊="onTeacherSelected($event)①"></B>

➊ 使用我们刚刚在子组件中定义的@Output() selected

① 方法名需要在父组件C层中定义,用于接收子组件传过来的事件,而参数名可以随性起,但我们一般为起名为$event以示此处为该组件的一个弹射器。

总结

到此这篇关于angular组件间通讯的文章就介绍到这了,更多相关angular组件间通讯内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
设置下载不需要倒计时cookie(倒计时代码)
Nov 19 Javascript
学习面向对象之面向对象的术语
Nov 30 Javascript
js操作textarea 常用方法总结
Dec 03 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
Feb 19 Javascript
javascript实现继承的简单实例
Jul 26 Javascript
JQuery为元素添加样式的实现方法
Jul 20 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
Nov 22 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
Mar 06 Javascript
Vue+webpack实现懒加载过程解析
Feb 17 Javascript
js 数组当前行添加数据方法详解
Jul 28 Javascript
vue实现移动端返回顶部
Oct 12 Javascript
Vue实现返回顶部按钮实例代码
Oct 21 Javascript
基于better-scroll 实现歌词联动功能的代码
May 07 #Javascript
Vue双向绑定实现原理与方法详解
May 07 #Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
May 07 #Javascript
微信小程序pinker组件使用实现自动相减日期
May 07 #Javascript
简单了解JavaScript弹窗实现代码
May 07 #Javascript
angular组件间传值测试的方法详解
May 07 #Javascript
Node.js API详解之 timer模块用法实例分析
May 07 #Javascript
You might like
世界第一个无线广播电台 KDKA
2021/03/01 无线电
php去除换行(回车换行)的三种方法
2014/03/26 PHP
php 如何获取文件的后缀名
2016/06/05 PHP
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
浅谈PHP的反射机制
2016/12/15 PHP
jquery判断单个复选框是否被选中的代码
2009/09/03 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
jquery根据name属性查找的小例子
2013/11/21 Javascript
JavaScript中发布/订阅模式的简单实例
2014/11/05 Javascript
JS实现跟随鼠标闪烁转动色块的方法
2015/02/26 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
2015/08/07 Javascript
JS从数组中随机取出几个数组元素的方法
2016/08/02 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
2016/12/03 Javascript
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
[08:47]DOTA2每周TOP10 精彩击杀集锦vol.6
2014/06/25 DOTA
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python中的默认参数详解
2015/06/24 Python
python3个性签名设计实现代码
2018/06/19 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
html+css3实现的登录界面
2020/12/09 HTML / CSS
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
前台接待岗位职责
2015/02/03 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android
Vue监视数据的原理详解
2022/02/24 Vue.js
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB