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 相关文章推荐
JavaScript入门教程(11) js事件处理
Jan 31 Javascript
javascript判断用户浏览器插件安装情况的代码
Jan 01 Javascript
JS中判断null、undefined与NaN的方法
Mar 26 Javascript
JavaScript访问CSS属性的几种方式介绍
Jul 21 Javascript
Javascript实现div的toggle效果实例分析
Jun 09 Javascript
APP中javascript+css3实现下拉刷新效果
Jan 27 Javascript
jQuery代码性能优化的10种方法
Jun 21 Javascript
Javascript中的getter和setter初识
Aug 17 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
Dec 06 Javascript
vue中轮训器的使用
Jan 27 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
Mar 06 Javascript
Vue.extend实现挂载到实例上的方法
May 01 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
php简单提示框alert封装函数
2010/08/08 PHP
Laravel5.7框架安装与使用学习笔记图文详解
2019/04/02 PHP
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
2012/02/03 Javascript
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
jQuery实现回车键(Enter)切换文本框焦点的代码实例
2014/05/05 Javascript
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
2014/09/26 NodeJs
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
2017/01/14 Javascript
js上下视差滚动简单实现代码
2017/03/07 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
python基于multiprocessing的多进程创建方法
2015/06/04 Python
Python时间模块datetime、time、calendar的使用方法
2016/01/13 Python
DataFrame中的object转换成float的方法
2018/04/10 Python
python如何实现异步调用函数执行
2019/07/08 Python
Python3 Click模块的使用方法详解
2020/02/12 Python
浅析python 动态库m.so.1.0错误问题
2020/05/09 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
体育教育专业毕业生自荐信
2013/11/15 职场文书
主题酒店策划书
2014/01/28 职场文书
银行工作检查书范文
2014/01/31 职场文书
党员廉洁自律个人总结
2015/02/13 职场文书
重阳节慰问信
2015/02/15 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS
iPhone13将有八大升级
2021/04/15 数码科技
浅谈Python类的单继承相关知识
2021/05/12 Python
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android