fix(core): getNode 添加stict参数来表示必须知道页面片容器id才会返回页面内的节点

This commit is contained in:
roymondchen 2025-12-09 15:51:15 +08:00
parent b3ce1a3b93
commit 83664cd440
9 changed files with 18 additions and 12 deletions

View File

@ -279,13 +279,13 @@ export default class EventHelper extends EventEmitter {
}
const toNodes = [];
const toNode = this.app.getNode(to);
const toNode = this.app.getNode(to, { strict: true });
if (toNode) {
toNodes.push(toNode);
}
for (const [, page] of this.app.pageFragments) {
const node = page.getNode(to);
const node = page.getNode(to, { strict: true });
if (node) {
toNodes.push(node);
}

View File

@ -191,7 +191,7 @@ 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);
const node = page.getNode(eventConfig.toId, { strict: true });
if (node && node === this) {
if (typeof instance[eventConfig.method] === 'function') {
await instance[eventConfig.method](eventConfig.fromCpt, ...eventConfig.args);

View File

@ -84,14 +84,16 @@ class Page extends Node {
public getNode<T extends TMagicNode = TMagicNode>(
id: Id,
{ iteratorContainerId, iteratorIndex, pageFragmentContainerId }: GetNodeOptions = {},
{ iteratorContainerId, iteratorIndex, pageFragmentContainerId, strict }: GetNodeOptions = {},
): T | undefined {
if (this.nodes.has(id)) {
return this.nodes.get(id) as T;
}
if (pageFragmentContainerId) {
return this.app.pageFragments.get(pageFragmentContainerId)?.getNode(id, { iteratorContainerId, iteratorIndex });
return this.app.pageFragments
.get(pageFragmentContainerId)
?.getNode(id, { iteratorContainerId, iteratorIndex, strict: true });
}
if (Array.isArray(iteratorContainerId) && iteratorContainerId.length && Array.isArray(iteratorIndex)) {
@ -107,7 +109,7 @@ class Page extends Node {
return iteratorContainer?.getNode(id, iteratorIndex[iteratorIndex.length - 1]) as T;
}
if (this.app.pageFragments.size) {
if (!strict && this.app.pageFragments.size) {
for (const [, pageFragment] of this.app.pageFragments) {
if (pageFragment.nodes.has(id)) {
return pageFragment.nodes.get(id) as T;

View File

@ -48,4 +48,6 @@ export interface GetNodeOptions {
iteratorContainerId?: Id[];
iteratorIndex?: number[];
pageFragmentContainerId?: Id;
/** 严格模式如果为true页面片中的节点必须指定pageFragmentContainerId为false时没有pageFragmentContainerId的时候获得第一个页面片容器中的节点 */
strict?: boolean;
}

View File

@ -78,13 +78,13 @@ export const createDataSourceManager = (app: TMagicApp, useMock?: boolean, initi
replaceChildNode(newNode, [app.page.data]);
}
app.getNode(node.id)?.setData(newNode);
app.getNode(node.id, { strict: true })?.setData(newNode);
for (const [, pageFragment] of app.pageFragments) {
if (pageFragment.data.id === newNode.id) {
pageFragment.setData(newNode);
} else if (pageFragment.data.id === page.id) {
pageFragment.getNode(newNode.id)?.setData(newNode);
pageFragment.getNode(newNode.id, { strict: true })?.setData(newNode);
if (!pageFragment.instance) {
replaceChildNode(newNode, [pageFragment.data]);
}

View File

@ -47,6 +47,7 @@ export const useNode = <T extends TMagicNode = TMagicNode>(
iteratorContainerId: props.iteratorContainerId,
iteratorIndex: props.iteratorIndex,
pageFragmentContainerId: props.pageFragmentContainerId,
strict: true,
});
}
return void 0;

View File

@ -82,7 +82,7 @@ export const useFormConfig = (props: AppProps) => {
if (!parent) throw new Error('未找到父节点');
if (config.type !== 'page') {
const parentNode = app?.page?.getNode(parent.id);
const parentNode = app?.page?.getNode(parent.id, { strict: true });
parentNode && app?.page?.initNode(config, parentNode);
}
@ -103,7 +103,7 @@ export const useFormConfig = (props: AppProps) => {
const newNode = app.dataSourceManager?.compiledNode(config) || config;
replaceChildNode(reactive(newNode), [root.value], parentId);
const nodeInstance = app.page?.getNode(config.id);
const nodeInstance = app.page?.getNode(config.id, { strict: true });
if (nodeInstance) {
nodeInstance.setData(config);
}

View File

@ -43,6 +43,7 @@ export const useNode = <T extends TMagicNode = TMagicNode>(
iteratorContainerId: props.iteratorContainerId,
iteratorIndex: props.iteratorIndex,
pageFragmentContainerId: props.pageFragmentContainerId,
strict: true,
});
}
return void 0;

View File

@ -74,7 +74,7 @@ export const useEditorDsl = (app = inject<TMagicApp>('app'), win = window) => {
if (!parent) throw new Error('未找到父节点');
if (config.type !== 'page') {
const parentNode = app?.page?.getNode(parent.id);
const parentNode = app?.page?.getNode(parent.id, { strict: true });
parentNode && app?.page?.initNode(config, parentNode);
}
@ -99,7 +99,7 @@ export const useEditorDsl = (app = inject<TMagicApp>('app'), win = window) => {
replaceChildNode(reactive(newNode), [root.value], parentId);
const nodeInstance = app.getNode(config.id);
const nodeInstance = app.getNode(config.id, { strict: true });
if (nodeInstance) {
nodeInstance.setData(newNode);
}