【Angular】eventDispatcher详解

news/2024/11/27 3:48:50/

eventDispatcher 是一种设计模式,用于在对象之间传递事件。它允许对象订阅和发布事件,从而实现松耦合的通信机制。以下是一个详细的解释和示例代码。

1. 基本概念

  • 事件(Event):一个动作或状态变化,可以被触发和监听。
  • 发布者(Publisher):触发事件的对象。
  • 订阅者(Subscriber):监听并响应事件的对象。
  • 事件分发器(Event Dispatcher):管理事件的发布和订阅,确保事件从发布者传递到订阅者。

2. 示例代码

假设我们有一个简单的事件分发器,用于在对象之间传递消息。

// 定义事件类型
type EventType = 'message';// 定义事件数据类型
interface EventData {message: string;
}// 定义事件处理函数类型
type EventHandler = (data: EventData) => void;// 事件分发器类
class EventDispatcher {private listeners: { [key in EventType]?: EventHandler[] } = {};// 订阅事件on(event: EventType, handler: EventHandler): void {if (!this.listeners[event]) {this.listeners[event] = [];}this.listeners[event]?.push(handler);}// 取消订阅事件off(event: EventType, handler: EventHandler): void {if (this.listeners[event]) {this.listeners[event] = this.listeners[event]?.filter(h => h !== handler);}}// 触发事件emit(event: EventType, data: EventData): void {if (this.listeners[event]) {this.listeners[event]?.forEach(handler => handler(data));}}
}// 使用示例
const eventDispatcher = new EventDispatcher();// 定义一个事件处理函数
const handleMessage = (data: EventData) => {console.log(`Received message: ${data.message}`);
};// 订阅事件
eventDispatcher.on('message', handleMessage);// 触发事件
eventDispatcher.emit('message', { message: 'Hello, World!' });// 取消订阅事件
eventDispatcher.off('message', handleMessage);// 再次触发事件,此时不会有任何输出
eventDispatcher.emit('message', { message: 'Another message' });

3. 解释

  1. 定义事件类型和数据类型

    • EventType:定义了事件的类型。
    • EventData:定义了事件的数据类型。
  2. 定义事件处理函数类型

    • EventHandler:定义了事件处理函数的类型。
  3. 事件分发器类

    • listeners:存储事件及其对应的处理函数列表。
    • on:订阅事件,将处理函数添加到事件的处理函数列表中。
    • off:取消订阅事件,从事件的处理函数列表中移除处理函数。
    • emit:触发事件,调用所有订阅该事件的处理函数。
  4. 使用示例

    • 创建一个 EventDispatcher 实例。
    • 定义一个事件处理函数 handleMessage
    • 订阅 message 事件。
    • 触发 message 事件,打印消息。
    • 取消订阅 message 事件。
    • 再次触发 message 事件,此时不会有输出。

通过这种方式,你可以轻松地在对象之间传递事件,并且可以灵活地添加和移除事件处理函数。


http://www.ppmy.cn/news/1550230.html

相关文章

SpringBoot开发——Maven多模块工程最佳实践及详细示例

文章目录 一、前言二、Maven多模块工程的最佳实践1、项目结构清晰2、依赖管理统一3、插件配置统一4、版本控制一致5、模块间通信简化 三、详细示例1、项目结构2、父模块(parent)的pom.xml文件3、子模块(module-api)的pom.xml文件4…

【Python】九大经典排序算法:从入门到精通的详解(冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、计数排序、基数排序、桶排序)

文章目录 1. 冒泡排序(Bubble Sort)2. 选择排序(Selection Sort)3. 插入排序(Insertion Sort)4. 归并排序(Merge Sort)5. 快速排序(Quick Sort)6. 堆排序&…

PyTorch2

Tensor的常见操作: 获取元素值: 注意: 和Tensor的维度没有关系,都可以取出来! 如果有多个元素则报错; import torch def test002():data torch.tensor([18])print(data.item())pass if __name__ &qu…

【高阶数据结构】图论

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是图,并能掌握深度优先遍历和广度优先遍历。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持…

单片机结合OpenCV

目录 一、引言 二、单片机结合 OpenCV 的优势 1. 图像识别与处理 2. 目标检测 3. 用户界面开发 4. Linux 在嵌入式系统中的作用 5. 多线程优势 6. 网络编程作用 7. 文件编程功能 三、OpenCV 在单片机上的实现难点 1. 处理能力限制 2. 通信与优化挑战 四、单片机如…

《基于FPGA的便携式PWM方波信号发生器》论文分析(二)——方波信号产生

一、论文概述 基于FPGA的便携式PWM方波信号发生器是一篇由任青颖、庹忠曜、黄洵桢、李智禺和张贤宇 等人发表的一篇期刊论文。该论文主要研究了一种新型的信号发生器,旨在解决传统PWM信号发生器在移动设备信号调控中存在的精准度低和便携性差的问题 。其基于现场可编…

xtu oj Estrella‘s Chocolate

样例输入 2 5 2 5 3 2 4 1 5 3 5 3 2 4 1样例输出 8 5 解题思路:二分法,emm……,感觉挺难想到的。 问题简化 给定一个数组,和一个值k,数组分成k段。要求这k段子段和最大值最小。求出这个值。 1、求出数组中的最大…

裸金属服务器能够帮助企业解决哪些问题?

随着网络科技的快速发展,企业业务也在不断的进行扩张和复杂化,传统的服务已经无法满足企业对于高性能和高稳定性的需求,而裸金属服务器则能够帮助企业来解决这一问题,下面我们就来具体看一下吧! 裸金属服务器能够允许应…