mirror of
https://github.com/Tencent/tmagic-editor.git
synced 2025-09-19 12:14:27 +08:00
feat(core): 异步加载dsl片段下,事件触发时node可能不存在
This commit is contained in:
parent
2605011df4
commit
01b88dba25
@ -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<string, Map<string, (...args: any[]) => 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) {
|
||||
|
@ -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');
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user