mirror of
https://github.com/Tencent/tmagic-editor.git
synced 2025-09-19 21:06:06 +08:00
feat(core): 异步加载dsl片段下,事件触发时node可能不存在
This commit is contained in:
parent
2605011df4
commit
01b88dba25
@ -31,6 +31,7 @@ import {
|
|||||||
type DataSourceItemConfig,
|
type DataSourceItemConfig,
|
||||||
type EventActionItem,
|
type EventActionItem,
|
||||||
type EventConfig,
|
type EventConfig,
|
||||||
|
Id,
|
||||||
NODE_DISABLE_CODE_BLOCK_KEY,
|
NODE_DISABLE_CODE_BLOCK_KEY,
|
||||||
NODE_DISABLE_DATA_SOURCE_KEY,
|
NODE_DISABLE_DATA_SOURCE_KEY,
|
||||||
} from '@tmagic/schema';
|
} from '@tmagic/schema';
|
||||||
@ -41,8 +42,17 @@ import FlowState from './FlowState';
|
|||||||
import type { default as TMagicNode } from './Node';
|
import type { default as TMagicNode } from './Node';
|
||||||
import { AfterEventHandler, BeforeEventHandler } from './type';
|
import { AfterEventHandler, BeforeEventHandler } from './type';
|
||||||
|
|
||||||
|
interface EventCache {
|
||||||
|
toId: Id;
|
||||||
|
method: string;
|
||||||
|
fromCpt: any;
|
||||||
|
args: any[];
|
||||||
|
handled?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
export default class EventHelper extends EventEmitter {
|
export default class EventHelper extends EventEmitter {
|
||||||
public app: TMagicApp;
|
public app: TMagicApp;
|
||||||
|
public eventQueue: EventCache[] = [];
|
||||||
|
|
||||||
private nodeEventList = new Map<(fromCpt: TMagicNode, ...args: any[]) => void, symbol>();
|
private nodeEventList = new Map<(fromCpt: TMagicNode, ...args: any[]) => void, symbol>();
|
||||||
private dataSourceEventList = new Map<string, Map<string, (...args: any[]) => void>>();
|
private dataSourceEventList = new Map<string, Map<string, (...args: any[]) => void>>();
|
||||||
@ -160,6 +170,14 @@ export default class EventHelper extends EventEmitter {
|
|||||||
this.dataSourceEventList.clear();
|
this.dataSourceEventList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getEventQueue() {
|
||||||
|
return this.eventQueue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public addEventToQueue(event: EventCache) {
|
||||||
|
this.eventQueue.push(event);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 事件联动处理函数
|
* 事件联动处理函数
|
||||||
* @param eventsConfigIndex 事件配置索引,可以通过此索引从node.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 = [];
|
const instanceMethodPropmise = [];
|
||||||
for (const node of toNodes) {
|
for (const node of toNodes) {
|
||||||
if (node.instance) {
|
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) {
|
if (this.data[NODE_DISABLE_CODE_BLOCK_KEY] !== true) {
|
||||||
this.runHookCode('mounted');
|
this.runHookCode('mounted');
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user