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 相关文章推荐
关于使用runtimeStyle属性问题讨论文章
Mar 08 Javascript
[原创]IE view-source 无法查看看源码 JavaScript看网页源码
Jul 19 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
Oct 27 Javascript
JavaScript SetInterval与setTimeout使用方法详解
Nov 15 Javascript
浅析JavaScript中的typeof运算符
Nov 30 Javascript
页面实时更新时间的JS实例代码
Dec 18 Javascript
js获取时间并实现字符串和时间戳之间的转换
Jan 05 Javascript
javascript原始值和对象引用实例分析
Apr 25 Javascript
JS如何判断json是否为空
Jul 06 Javascript
详解如何使用webpack打包Vue工程
May 27 Javascript
Vue多种方法实现表头和首列固定的示例代码
Feb 02 Javascript
微信小程序 导入图标实现过程详解
Oct 11 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
Zend framework处理一个http请求的流程分析
2010/02/08 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
jquery简单图片切换显示效果实现方法
2015/01/14 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
vue.js从安装到搭建过程详解
2017/03/17 Javascript
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
vue引入swiper插件的使用实例
2017/07/19 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
2019/05/21 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
jquery实现吸顶导航效果
2020/01/08 jQuery
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
[05:07]DOTA2英雄梦之声_第14期_暗影恶魔
2014/06/20 DOTA
Window环境下Scrapy开发环境搭建
2018/11/18 Python
Python整数对象实现原理详解
2019/07/01 Python
python中property和setter装饰器用法
2019/12/19 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
社区中秋节活动方案
2014/01/29 职场文书
机关作风建设整改方案
2014/10/27 职场文书
意向协议书
2015/01/27 职场文书
导游词之天下银坑景区
2019/11/21 职场文书
redis 查看所有的key方式
2021/05/07 Redis
MySQL 数据类型详情
2021/11/11 MySQL
python pygame 开发五子棋双人对弈
2022/05/02 Python
Java+swing实现抖音上的表白程序详解
2022/06/25 Java/Android
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android