فهرست منبع

fix: onContentChange is executed after the node is disposed (#260)

* fix: onContentChange is executed after the node is disposed

* fix: onContentChange is executed after the line is disposed
xiamidaxia 7 ماه پیش
والد
کامیت
e9218afcaa

+ 15 - 22
packages/canvas-engine/free-layout-core/src/workflow-document.ts

@@ -1,6 +1,6 @@
 import { customAlphabet } from 'nanoid';
 import { customAlphabet } from 'nanoid';
 import { inject, injectable, optional, postConstruct } from 'inversify';
 import { inject, injectable, optional, postConstruct } from 'inversify';
-import { Disposable, Emitter, type IPoint } from '@flowgram.ai/utils';
+import { Emitter, type IPoint } from '@flowgram.ai/utils';
 import { NodeEngineContext } from '@flowgram.ai/form-core';
 import { NodeEngineContext } from '@flowgram.ai/form-core';
 import { FlowDocument, FlowNodeBaseType, FlowNodeTransformData } from '@flowgram.ai/document';
 import { FlowDocument, FlowNodeBaseType, FlowNodeTransformData } from '@flowgram.ai/document';
 import {
 import {
@@ -230,27 +230,20 @@ export class WorkflowDocument extends FlowDocument {
         entity: node,
         entity: node,
         toJSON: () => this.toNodeJSON(node),
         toJSON: () => this.toNodeJSON(node),
       });
       });
-      node.toDispose.push(
-        Disposable.create(() => {
-          this.fireContentChange({
-            type: WorkflowContentChangeType.DELETE_NODE,
-            entity: node,
-            toJSON: () => this.toNodeJSON(node),
-          });
-        })
-      );
-      node.toDispose.push(
-        Disposable.create(() => {
-          if (!node.parent || node.parent.flowNodeType === FlowNodeBaseType.ROOT) {
-            return;
-          }
-          const parentTransform = node.parent.getData(FlowNodeTransformData);
-          // 加延迟是因为这个回调触发时节点实体还没有被销毁
-          setTimeout(() => {
-            parentTransform.fireChange();
-          }, 0);
-        })
-      );
+      node.onDispose(() => {
+        if (!node.parent || node.parent.flowNodeType === FlowNodeBaseType.ROOT) {
+          return;
+        }
+        const parentTransform = node.parent.getData(FlowNodeTransformData);
+        parentTransform.fireChange();
+      });
+      node.onDispose(() => {
+        this.fireContentChange({
+          type: WorkflowContentChangeType.DELETE_NODE,
+          entity: node,
+          toJSON: () => this.toNodeJSON(node),
+        });
+      });
     }
     }
 
 
     // 若存在子节点,则创建子节点
     // 若存在子节点,则创建子节点

+ 10 - 12
packages/canvas-engine/free-layout-core/src/workflow-lines-manager.ts

@@ -1,6 +1,6 @@
 import { last } from 'lodash-es';
 import { last } from 'lodash-es';
 import { inject, injectable } from 'inversify';
 import { inject, injectable } from 'inversify';
-import { Disposable, DisposableCollection, Emitter, type IPoint } from '@flowgram.ai/utils';
+import { DisposableCollection, Emitter, type IPoint } from '@flowgram.ai/utils';
 import { FlowNodeRenderData, FlowNodeTransformData } from '@flowgram.ai/document';
 import { FlowNodeRenderData, FlowNodeTransformData } from '@flowgram.ai/document';
 import { EntityManager, PlaygroundConfigEntity, TransformData } from '@flowgram.ai/core';
 import { EntityManager, PlaygroundConfigEntity, TransformData } from '@flowgram.ai/core';
 
 
@@ -198,17 +198,15 @@ export class WorkflowLinesManager {
       // 连线销毁时检验 连线错误态 & 端口错误态
       // 连线销毁时检验 连线错误态 & 端口错误态
       line.validate();
       line.validate();
     });
     });
-    line.toDispose.push(
-      Disposable.create(() => {
-        if (available) {
-          this.onAvailableLinesChangeEmitter.fire({
-            type: WorkflowContentChangeType.DELETE_LINE,
-            toJSON: () => line.toJSON(),
-            entity: line,
-          });
-        }
-      })
-    );
+    line.onDispose(() => {
+      if (available) {
+        this.onAvailableLinesChangeEmitter.fire({
+          type: WorkflowContentChangeType.DELETE_LINE,
+          toJSON: () => line.toJSON(),
+          entity: line,
+        });
+      }
+    });
     // 是否为有效的线条
     // 是否为有效的线条
     if (available) {
     if (available) {
       this.onAvailableLinesChangeEmitter.fire({
       this.onAvailableLinesChangeEmitter.fire({