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 相关文章推荐
用jquery实现点击栏目背景色改变
Dec 10 Javascript
js出生日期 年月日级联菜单示例代码
Jan 10 Javascript
js实现延迟加载的方法
Jun 24 Javascript
js实现图片点击左右轮播
Jul 08 Javascript
JS实现网页上随机产生超链接地址的方法
Nov 09 Javascript
Bootstrap每天必学之表单
Nov 23 Javascript
Vue-resource实现ajax请求和跨域请求示例
Feb 23 Javascript
React Native之TextInput组件解析示例
Aug 22 Javascript
vue 简单自动补全的输入框的示例
Mar 12 Javascript
layui动态绑定事件的方法
Sep 20 Javascript
layui禁用侧边导航栏点击事件的解决方法
Sep 25 Javascript
jquery插件懒加载的示例
Oct 24 jQuery
基于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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
yii数据库的查询方法
2015/12/28 PHP
phpmyadmin在宝塔面板里进不去的解决方案
2020/07/06 PHP
javascript 文档的编码问题解决
2009/03/01 Javascript
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
默认让页面的第一个控件选中的javascript代码
2009/12/26 Javascript
JavaScript解析URL参数示例代码
2013/08/12 Javascript
AngularJS入门教程之路由与多视图详解
2016/08/19 Javascript
微信小程序 wx:key详细介绍
2016/10/28 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
JavaScript Date对象应用实例分享
2017/10/30 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
详解ES7 Decorator 入门解析
2019/02/18 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
10种检测Python程序运行时间、CPU和内存占用的方法
2015/04/01 Python
python使用pyqt写带界面工具的示例代码
2017/10/23 Python
简述Python2与Python3的不同点
2018/01/21 Python
python数据结构之线性表的顺序存储结构
2018/09/28 Python
Python字符串处理的8招秘籍(小结)
2019/08/13 Python
PyTorch实现更新部分网络,其他不更新
2019/12/31 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
乌克兰在线商店的价格比较:Price.ua
2019/07/26 全球购物
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
制衣厂各岗位职责
2013/12/02 职场文书
寒假思想汇报
2014/01/10 职场文书
奶茶专卖店创业计划书
2014/01/18 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
离婚协议书范文2015
2015/01/26 职场文书
师德师风个人总结
2015/02/06 职场文书
严以修身专题学习研讨会发言材料
2015/11/09 职场文书
提升Nginx性能的一些建议
2021/03/31 Servers
python单向链表实例详解
2022/05/25 Python