Angular事件之不同组件间传递数据的方法


Posted in Javascript onNovember 15, 2018

利用Angular Event在不同组件之间传递数据

为了实现在Angular不同Component之间相互传递数据,可以使用Event分发的思路来实现。

使用事件实现在不同组件之前传递数据的思路如下:

  • 定义一个服务,用来实现事件的发布和订阅方法。
  • 组件A注入事件服务的依赖,将自己要传递数据的数据以事件的形式发布出去。
  • 组件B注入事件服务的依赖,并订阅相关事件。

定义一个服务

在终端输入

ng g service event

Angular会自动在项目的app目录下生成 event.service.ts 和 event.service.spec.ts 两个文件。

我们在 event.service.ts 文件中完成相关业务代码即可。

例如,我们在改服务中实现发布事件和订阅事件的方法:

import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class EventService {
  // 构建Subject的实例,用来完成事件的发布和订阅
  private subject = new Subject < any > ();
  constructor() {}
  publish(value: any, err: any) {
    if (value !== undefined) {
      // 将新的事件放入next队列中
      this.subject.next(value);
    }
    if (err !== undefined) {
      // 将错误放入error队列
      this.subject.error(err);
    }
    // 表示当前事件结束
    this.subject.complete();
  }

  subcribe(handler: {
   next: (value) => void,
   error: (err) => void,
   complete: () => void
  }) {
    this.subject.asObservable().subcribe(handler);
  }
}

最后,为了能让我们定义的服务能够被注入到其他组件中,我们还需要在app.modules.ts文件中注册我们的服务:

@NgModule({
 declarations: [],
 imports: [],
 providers: [EventService],
 bootstrap: [AppComponent]
})
export class AppModule { }

利用EventService在不同组件间传递数据

假定组件A中的数据需要传递到组件B中,这里的数据可以是事件、文本内容、状态改变等等东西。 则在组件A中,我们可以发布一个事件,组件B订阅该事件即可。

在组件A中发布事件

export class AComponent implements OnInit {
 constructor(
  private event: EventService
 ) { }
 ngOnInit() {
 }
 someThingChanged(data) {
  // 发布事件
  this.event.publish({
   // 可以定义一个事件类型,实现多个不同类型事件的发布
   type: 'event_type_you_want_define',
   // 可以携带任何数据,并通过事件发布出去
   data: data,
   ohter: 'ohter things you want to pass out'
  }, err);
 }
}

在组件B中订阅事件

export BComponent implements OnInit {
 constructor(
  private event: EventService
 ) { }
 ngOnInit() {
   // 在初始化方法中,可以完成对事件的订阅工作
  this.event.subject({
   next: value => {
    // 可以通过约定事件类型,在这里进行检查,从而完成不同的逻辑
    // do something with value
   },
   error: err => {
    // handle err
   },
   complete: () => {
    // handle complete
   }
  })
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript自执行闭包的小例子
Jun 29 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
Sep 30 Javascript
JavaScript 实现鼠标拖动元素实例代码
Feb 24 Javascript
详解JavaScript ES6中的模板字符串
Jul 28 Javascript
jQuery on()方法示例及jquery on()方法的优点
Aug 27 Javascript
基于javascript实现图片懒加载
Jan 05 Javascript
javascript html5摇一摇功能的实现
Apr 19 Javascript
jquery html动态添加的元素绑定事件详解
May 24 Javascript
深入理解JS函数的参数(arguments)的使用
May 28 Javascript
图文详解JavaScript的原型对象及原型链
Aug 02 Javascript
Angularjs 动态改变title标题(兼容ios)
Dec 29 Javascript
Vue3.0 手写放大镜效果
Jul 25 Vue.js
vue 移动端适配方案详解
Nov 15 #Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
Nov 15 #Javascript
vue地址栏直接输入路由无效问题的解决
Nov 15 #Javascript
微信小程序自定义toast弹窗效果的实现代码
Nov 15 #Javascript
搭建基于express框架运行环境的方法步骤
Nov 15 #Javascript
用图片替换checkbox原始样式并实现同样的功能
Nov 15 #Javascript
微信小程序swiper实现滑动放大缩小效果
Nov 15 #Javascript
You might like
php字符串分割函数用法实例
2015/03/17 PHP
PHP将URL转换成短网址的算法分享
2016/09/13 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
快速入门Vue
2016/12/19 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
vue-router为激活的路由设置样式操作
2020/07/18 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
2021/03/01 Vue.js
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
Python multiprocessing模块中的Pipe管道使用实例
2015/04/11 Python
python抓取百度首页的方法
2015/05/19 Python
分析并输出Python代码依赖的库的实现代码
2015/08/09 Python
Python简单实现子网掩码转换的方法
2016/04/13 Python
python实现随机梯度下降(SGD)
2020/03/24 Python
Pythony运维入门之Socket网络编程详解
2019/04/15 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
python内存动态分配过程详解
2019/07/15 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
Python Selenium截图功能实现代码
2020/04/26 Python
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
澳大利亚当地社区首选的光学商店:1001 Optical
2019/08/24 全球购物
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
作文批改评语大全
2014/04/23 职场文书
农村党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
论群众路线学习笔记
2014/11/06 职场文书
2014年度工作总结报告
2014/12/15 职场文书
承诺函范文
2015/01/21 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers
vue实现拖拽交换位置
2022/04/07 Vue.js