From d981014160625ce4bafad52428862cc070e5c604 Mon Sep 17 00:00:00 2001 From: parisma Date: Thu, 21 Dec 2023 11:22:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(editor,dep):=20watcher=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=96=B9=E6=B3=95:=E6=B8=85=E9=99=A4=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E7=9A=84=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/dep/src/Watcher.ts | 25 ++++++++++++++++++++++++- packages/editor/src/services/dep.ts | 4 ++++ packages/editor/src/services/editor.ts | 2 +- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/packages/dep/src/Watcher.ts b/packages/dep/src/Watcher.ts index c6a9d2d4..7e3a79bd 100644 --- a/packages/dep/src/Watcher.ts +++ b/packages/dep/src/Watcher.ts @@ -120,7 +120,7 @@ export default class Watcher { } /** - * 清除依赖 + * 清除所有目标的依赖 * @param nodes 需要清除依赖的节点 */ public clear(nodes?: Record[]) { @@ -143,6 +143,29 @@ export default class Watcher { }); } + /** + * 清除指定类型的依赖 + * @param type 类型 + * @param nodes 需要清除依赖的节点 + */ + public clearByType(type: DepTargetType, nodes?: Record[]) { + const clearedItemsNodeIds: (string | number)[] = []; + const targetList = this.getTargets(type); + Object.values(targetList).forEach((target) => { + if (nodes) { + nodes.forEach((node) => { + target.removeDep(node); + if (Array.isArray(node.items) && node.items.length && !clearedItemsNodeIds.includes(node.id)) { + clearedItemsNodeIds.push(node.id); + this.clear(node.items); + } + }); + } else { + target.removeDep(); + } + }); + } + private collectItem(node: Record, target: Target, deep = false) { const collectTarget = (config: Record, prop = '') => { const doCollect = (key: string, value: any) => { diff --git a/packages/editor/src/services/dep.ts b/packages/editor/src/services/dep.ts index 4591d152..87331c60 100644 --- a/packages/editor/src/services/dep.ts +++ b/packages/editor/src/services/dep.ts @@ -62,6 +62,10 @@ class Dep extends BaseService { return this.watcher.clear(nodes); } + public clearByType(type: DepTargetType, nodes?: MNode[]) { + return this.watcher.clearByType(type, nodes); + } + public hasTarget(id: Id, type: string = DepTargetType.DEFAULT) { return this.watcher.hasTarget(id, type); } diff --git a/packages/editor/src/services/editor.ts b/packages/editor/src/services/editor.ts index 92dfbd87..60b85d87 100644 --- a/packages/editor/src/services/editor.ts +++ b/packages/editor/src/services/editor.ts @@ -644,7 +644,7 @@ class Editor extends BaseService { public copyWithRelated(config: MNode | MNode[]): void { const copyNodes: MNode[] = Array.isArray(config) ? config : [config]; // 关联的组件也一并复制 - depService.getTarget(DepTargetType.RELATED_COMP_WHEN_COPY, DepTargetType.RELATED_COMP_WHEN_COPY)?.removeDep(); + depService.clearByType(DepTargetType.RELATED_COMP_WHEN_COPY); depService.collect(copyNodes, true, DepTargetType.RELATED_COMP_WHEN_COPY); const customTarget = depService.getTarget( DepTargetType.RELATED_COMP_WHEN_COPY,