diff --git a/packages/data-source/src/DataSourceManager.ts b/packages/data-source/src/DataSourceManager.ts index 44ec650a..96e4abdf 100644 --- a/packages/data-source/src/DataSourceManager.ts +++ b/packages/data-source/src/DataSourceManager.ts @@ -246,9 +246,11 @@ class DataSourceManager extends EventEmitter { const ds = this.get(dsId); if (!ds) return nodes; + const inEditor = this.app.platform === 'editor'; + const ctxData = createIteratorContentData(itemData, ds.id, keys, this.data); - const { deps = {}, condDeps = {} } = getDeps(ds.schema, nodes); + const { deps = {}, condDeps = {} } = getDeps(ds.schema, nodes, inEditor); if (!Object.keys(deps).length && !Object.keys(condDeps).length) { return nodes; @@ -261,7 +263,7 @@ class DataSourceManager extends EventEmitter { item, deps, condDeps, - inEditor: this.app.platform === 'editor', + inEditor, ctxData, }), ); diff --git a/packages/data-source/src/depsCache.ts b/packages/data-source/src/depsCache.ts index dda86ac6..d11444a0 100644 --- a/packages/data-source/src/depsCache.ts +++ b/packages/data-source/src/depsCache.ts @@ -1,10 +1,30 @@ -import type { DataSourceSchema, MNode } from '@tmagic/core'; -import { DSL_NODE_KEY_COPY_PREFIX, isDataSourceCondTarget, isDataSourceTarget, Target, Watcher } from '@tmagic/core'; +import type { DataSourceSchema, Id, MNode } from '@tmagic/core'; +import { + DSL_NODE_KEY_COPY_PREFIX, + isDataSourceCondTarget, + isDataSourceTarget, + Target, + traverseNode, + Watcher, +} from '@tmagic/core'; const cache = new Map(); -export const getDeps = (ds: DataSourceSchema, nodes: MNode[]) => { - const cacheKey = `${ds.id}:${nodes.map((node) => node.id).join(':')}`; +export const getDeps = (ds: DataSourceSchema, nodes: MNode[], inEditor: boolean) => { + let cacheKey: string; + + if (inEditor) { + const ids: Id[] = []; + nodes.forEach((node) => { + traverseNode(node, (node) => { + ids.push(node.id); + }); + }); + + cacheKey = `${ds.id}:${ids.join(':')}`; + } else { + cacheKey = `${ds.id}:${nodes.map((node) => node.id).join(':')}`; + } if (cache.has(cacheKey)) { return cache.get(cacheKey);