From fb2e4f7578e1c7453c9d65b26103dbd2e6c4b764 Mon Sep 17 00:00:00 2001 From: xile611 Date: Thu, 8 Aug 2024 15:04:53 +0800 Subject: [PATCH] refactor: optimize event-dispatcher --- packages/vchart/src/event/event-dispatcher.ts | 65 ++++++++----------- 1 file changed, 27 insertions(+), 38 deletions(-) diff --git a/packages/vchart/src/event/event-dispatcher.ts b/packages/vchart/src/event/event-dispatcher.ts index 8709fd7d98..01f02f20b7 100644 --- a/packages/vchart/src/event/event-dispatcher.ts +++ b/packages/vchart/src/event/event-dispatcher.ts @@ -150,21 +150,18 @@ export class EventDispatcher implements IEventDispatcher { const handlers = bubble.getHandlers(level); stopBubble = this._invoke(handlers, eType, params); } else { - // Mark 级别的事件只包含对语法层代理的基础事件 - const handlers = bubble.getHandlers(Event_Bubble_Level.mark); - stopBubble = this._invoke(handlers, eType, params); + const levels = [ + Event_Bubble_Level.mark, + Event_Bubble_Level.model, + Event_Bubble_Level.chart, + Event_Bubble_Level.vchart + ]; + let i = 0; - if (!stopBubble) { - const handlers = bubble.getHandlers(Event_Bubble_Level.model); - stopBubble = this._invoke(handlers, eType, params); - } - if (!stopBubble) { - const handlers = bubble.getHandlers(Event_Bubble_Level.chart); - stopBubble = this._invoke(handlers, eType, params); - } - if (!stopBubble) { - const handlers = bubble.getHandlers(Event_Bubble_Level.vchart); - stopBubble = this._invoke(handlers, eType, params); + // Mark 级别的事件只包含对语法层代理的基础事件 + while (!stopBubble && i < levels.length) { + stopBubble = this._invoke(bubble.getHandlers(levels[i]), eType, params); + i++; } } @@ -198,30 +195,22 @@ export class EventDispatcher implements IEventDispatcher { } clear(): void { - for (const entry of this._viewListeners.entries()) { - this._compiler.removeEventListener(Event_Source_Type.chart, entry[0], entry[1]); - } - this._viewListeners.clear(); - for (const entry of this._windowListeners.entries()) { - this._compiler.removeEventListener(Event_Source_Type.window, entry[0], entry[1]); - } - this._windowListeners.clear(); - for (const entry of this._canvasListeners.entries()) { - this._compiler.removeEventListener(Event_Source_Type.canvas, entry[0], entry[1]); - } - this._canvasListeners.clear(); - for (const bubble of this._viewBubbles.values()) { - bubble.release(); - } - this._viewBubbles.clear(); - for (const bubble of this._windowBubbles.values()) { - bubble.release(); - } - this._windowBubbles.clear(); - for (const bubble of this._canvasBubbles.values()) { - bubble.release(); - } - this._canvasBubbles.clear(); + const types = [Event_Source_Type.chart, Event_Source_Type.window, Event_Source_Type.canvas]; + + types.forEach(type => { + const listeners = this.getEventListeners(type); + for (const entry of listeners.entries()) { + this._compiler.removeEventListener(type, entry[0], entry[1]); + } + listeners.clear(); + }); + + [this._viewBubbles, this._windowBubbles, this._canvasBubbles].forEach(bubbles => { + for (const bubble of bubbles.values()) { + bubble.release(); + } + bubbles.clear(); + }); } release(): void {