首页 > 其他分享 >angular event服务,不同组件间参数传递

angular event服务,不同组件间参数传递

时间:2023-09-19 12:05:47浏览次数:48  
标签:service value angular 参数传递 事件 组件 event EventService

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

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

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

定义一个服务

在终端输入
ng g service event
Angular会自动在项目的app目录下生成 event.service.tsevent.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().subscribe(handler);
    }
}

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

import { EventService } from './service/event.service';

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

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

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

在组件A中发布事件

import { EventService } from '../../service/event.service';

export class AComponent implements OnInit {
  constructor(
    private eventS: EventService
  ) { }
  ngOnInit() {
  }
  someThingChanged(data) {
    // 发布事件
    this.eventS.publish({
      // 可以定义一个事件类型,实现多个不同类型事件的发布
      type: 'run finished',
      // 可以携带任何数据,并通过事件发布出去
      data: {'close': true},
      ohter: 'ohter msg'
    },'error');
  }
}

在组件B中订阅事件

import { EventService } from '../../service/event.service';

export BComponent implements OnInit {
  constructor(
    private eventS: EventService
  ) { }
  ngOnInit() {
    // 在ngOnInit,完成事件订阅
      this.eventS.subcribe({
        next: value => {
          // do something with value
          // console.log('next value: ' ,value)
          if (value.data.close == true) {
            this.isSpinning = false;
          }
        },
        error: err => {
          // handle err
        },
        complete: () => {
          // handle complete
          // console.log('complete')
        }
      })
  }
}

参考

标签:service,value,angular,参数传递,事件,组件,event,EventService
From: https://blog.51cto.com/u_15785525/7523981

相关文章

  • 如何显示并管理Python应用的数据?Kendo UI for Angular有妙招!
    Angular是Python应用中进行数据管理和显示的一个很好的选择,如果能使用KendoUIforAngular则可以更进一步。PS:给大家推荐一个实用组件~KendoUIforAngular是专业级的AngularUI组件库,不仅是将其他供应商提供的现有组件封装起来,telerik致力于提供纯粹高性能的AngularUI组件,而......
  • 使用CQRS和Event Sourcing实现高性能.NET应用程序
    摘要本文介绍了如何使用CQRS(命令查询职责分离)和EventSourcing在.NET应用程序中实现高性能和可扩展性。我们将在一个具体的业务场景中应用这些模式,以演示它们如何解决实际问题。引言随着业务的发展和用户需求的增加,我们作为.NET程序员需要考虑如何提高应用程序的性能和可扩展性......
  • e.preventdefault()别滥用
    有的时候我们会为事件回调函数添加一个参数(通常是e),并在函数中加入e.preventdefault();以取消默认行为。由于习惯,我顺手将它写到了一个checkbox的change事件中。由于不同的浏览器解释不同,在IE8上出现了一个bug:change事件能进入,但是UI显示上不能讲复选框的选中状态重绘。分析原因,是我......
  • EventSource推送协议
    EventSource传输协议最近开发项目中, 有个需求是 客户端发送指令给服务端, 服务端接收指令,进行解析,解析完成才进行返回, 由于不是实时返回,当时考虑的两种技术方案 1运用定时器 进行轮询请求刷新, 2应用WebSocket, 考虑 轮询请求有点占用资源, 运用WebSocket有点没必......
  • 关于 Angular 应用里 Rxjs filter 操作符内的双重感叹号的用法
    看下列这段出现在AngularComponent内的代码:protecteduserCostCenters$:Observable<CostCenter[]>=this.userCostCenterService.getActiveCostCenters().pipe(filter((costCenters)=>!!costCenters));这段Angular组件代码涉及到Observable和RxJS操作......
  • 关于 Angular 的 HostBinding 装饰器
    看这段AngularComponent的代码:@HostBinding('class.hidden')getdisabled(){return!this.isAccountPayment;}@HostBinding('class.hidden')这段代码是Angular中的一个装饰器,用于在组件类中绑定宿主元素(hostelement)的属性。在这个特定的例子中,它用来绑定宿......
  • 领域驱动模型DDD(四)——Eventuate Tram Saga源码讲解
    前言虽然本人一直抱怨《微服务架构设计模式》中DDD模式下采用的EventuateTramSaga不算简单易用,但是为了更加深入了解原文作者的设计思路,还是花了点时间去阅读源码,并且为了自己日后自己返回来看的懂,就斗胆地对整个EventuateTramSaga从注册到执行的代码运行流程进行注释解读下,......
  • RocketMQ-(8-1)-EventBridge-EventBridge 核心概念
    RocketMQEventBridge核心概念理解EventBridge中的核心概念,能帮助我们更好的分析和使用EventBridge。本文重点介绍下EventBridge中包含的术语:EventSource:事件源。用于管理发送到EventBridge的事件,所有发送到EventBridge中的事件都必须标注事件源名称信息,对应CloudEvent事件体中的s......
  • RocketMQ-(9-1)-MQTT-EventBridge概述
    RocketMQMQTT概览传统的消息队列MQ主要应用于服务(端)之间的消息通信,比如电商领域的交易消息、支付消息、物流消息等等。然而在消息这个大类下,还有一个非常重要且常见的消息领域,即IoT类终端设备消息。近些年,我们看到随着智能家居、工业互联而兴起的面向IoT设备类的消息正在呈爆炸式......
  • Git commit - Angular Convention
    使用Git的开发者会使用gitcommit进行代码提交,也会使用-m提交commitmessage。对于一些个人开发者,也许他们会觉得“这是我个人的项目,不用太在意gitcommitmessage的格式或者规范”。但是对于一个团队或者在开源项目上工作的话,对于commitmessage的质量就会有比较高......