From 01b88dba251a1f7cc29947c2a80e15839e50fcca Mon Sep 17 00:00:00 2001 From: roymondchen Date: Tue, 22 Jul 2025 20:23:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(core):=20=E5=BC=82=E6=AD=A5=E5=8A=A0?= =?UTF-8?q?=E8=BD=BDdsl=E7=89=87=E6=AE=B5=E4=B8=8B=EF=BC=8C=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E8=A7=A6=E5=8F=91=E6=97=B6node=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E4=B8=8D=E5=AD=98=E5=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/src/EventHelper.ts | 28 ++++++++++++++++++++++++++++ packages/core/src/Node.ts | 19 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/packages/core/src/EventHelper.ts b/packages/core/src/EventHelper.ts index ee44ca60..5293cab1 100644 --- a/packages/core/src/EventHelper.ts +++ b/packages/core/src/EventHelper.ts @@ -31,6 +31,7 @@ import { type DataSourceItemConfig, type EventActionItem, type EventConfig, + Id, NODE_DISABLE_CODE_BLOCK_KEY, NODE_DISABLE_DATA_SOURCE_KEY, } from '@tmagic/schema'; @@ -41,8 +42,17 @@ import FlowState from './FlowState'; import type { default as TMagicNode } from './Node'; import { AfterEventHandler, BeforeEventHandler } from './type'; +interface EventCache { + toId: Id; + method: string; + fromCpt: any; + args: any[]; + handled?: boolean; +} + export default class EventHelper extends EventEmitter { public app: TMagicApp; + public eventQueue: EventCache[] = []; private nodeEventList = new Map<(fromCpt: TMagicNode, ...args: any[]) => void, symbol>(); private dataSourceEventList = new Map void>>(); @@ -160,6 +170,14 @@ export default class EventHelper extends EventEmitter { this.dataSourceEventList.clear(); } + public getEventQueue() { + return this.eventQueue; + } + + public addEventToQueue(event: EventCache) { + this.eventQueue.push(event); + } + /** * 事件联动处理函数 * @param eventsConfigIndex 事件配置索引,可以通过此索引从node.event中获取最新事件配置 @@ -271,6 +289,16 @@ export default class EventHelper extends EventEmitter { } } + if (toNodes.length === 0) { + this.addEventToQueue({ + toId: to, + method: methodName, + fromCpt, + args, + }); + return; + } + const instanceMethodPropmise = []; for (const node of toNodes) { if (node.instance) { diff --git a/packages/core/src/Node.ts b/packages/core/src/Node.ts index fb3bff39..fa326e38 100644 --- a/packages/core/src/Node.ts +++ b/packages/core/src/Node.ts @@ -202,6 +202,25 @@ class Node extends EventEmitter { } } + if (this.app.eventHelper) { + for (const eventConfig of this.app.eventHelper.getEventQueue()) { + for (const [, page] of this.app.pageFragments) { + const node = page.getNode(eventConfig.toId); + if (node && node === this) { + if (typeof instance[eventConfig.method] === 'function') { + await instance[eventConfig.method](eventConfig.fromCpt, ...eventConfig.args); + } + + eventConfig.handled = true; + } + } + } + + this.app.eventHelper.eventQueue = this.app.eventHelper + .getEventQueue() + .filter((eventConfig) => !eventConfig.handled); + } + if (this.data[NODE_DISABLE_CODE_BLOCK_KEY] !== true) { this.runHookCode('mounted'); }