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'); }