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 相关文章推荐
JS类中定义原型方法的两种实现的区别
Mar 08 Javascript
jquery实现输入框动态增减的实例代码
Jul 14 Javascript
javascript中RegExp保留小数点后几位数的方法分享
Aug 13 Javascript
Javascript 按位与运算符 (&amp;)使用介绍
Feb 04 Javascript
node.js中的fs.utimesSync方法使用说明
Dec 15 Javascript
Javascript技术栈中的四种依赖注入详解
Feb 23 Javascript
基于jQuery的Web上传插件Uploadify使用示例
May 19 Javascript
AngularJs表单验证实例详解
May 30 Javascript
jQuery自动或手动图片切换效果
Oct 11 jQuery
vue模仿网易云音乐的单页面应用
Apr 24 Javascript
laydate只显示时分 不显示秒的功能实现方法
Sep 28 Javascript
利用promise及参数解构封装ajax请求的方法
Mar 24 Javascript
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
Oracle Faq(Oracle的版本)
2006/10/09 PHP
PHP加密解密类实例分析
2015/04/20 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
JavaScript检测鼠标移动方向的方法
2015/05/22 Javascript
html5+javascript实现简单上传的注意细节
2016/04/18 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
使用gulp构建前端自动化的方法示例
2018/12/25 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
python使用win32com库播放mp3文件的方法
2015/05/30 Python
Python中atexit模块的基本使用示例
2015/07/08 Python
Python3 XML 获取雅虎天气的实现方法
2018/02/01 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
2019/04/11 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
详解Python中namedtuple的使用
2020/04/27 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
荷兰包包购物网站:The Little Green Bag
2018/03/17 全球购物
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
斯福泰克软件测试面试题
2015/02/16 面试题
人力资源管理毕业生自荐信
2013/11/21 职场文书
家长对孩子评语
2014/01/30 职场文书
优秀教师获奖感言
2014/01/31 职场文书
综合内勤岗位职责
2014/04/14 职场文书
优秀会计求职信
2014/07/04 职场文书
安全月宣传标语
2014/10/07 职场文书
会计主管岗位职责
2015/04/02 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
JS setTimeout与setInterval的区别
2022/04/20 Javascript
Android Studio 计算器开发
2022/05/20 Java/Android