Skip to content

Commit 9444752

Browse files
liujupingJackLian
authored andcommitted
fix: fix onChangeNodeVisible & onChangeNodeChildren cannot be triggered successfully in some cases
1 parent 8d2fe15 commit 9444752

File tree

10 files changed

+50
-25
lines changed

10 files changed

+50
-25
lines changed

packages/designer/src/document/document-model.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import {
1515
IPublicApiProject,
1616
IPublicModelDropLocation,
1717
IPublicEnumTransformStage,
18+
IPublicOnChangeOptions,
19+
EDITOR_EVENT,
1820
} from '@alilc/lowcode-types';
1921
import { Project } from '../project';
2022
import { ISimulatorHost } from '../simulator';
@@ -158,6 +160,22 @@ export class DocumentModel implements IDocumentModel {
158160
this.inited = true;
159161
}
160162

163+
onChangeNodeVisible(fn: (node: IPublicModelNode, visible: boolean) => void): () => void {
164+
this.designer.editor?.eventBus.on(EDITOR_EVENT.NODE_CHILDREN_CHANGE, fn);
165+
166+
return () => {
167+
this.designer.editor?.eventBus.off(EDITOR_EVENT.NODE_CHILDREN_CHANGE, fn);
168+
};
169+
}
170+
171+
onChangeNodeChildren(fn: (info: IPublicOnChangeOptions) => void): () => void {
172+
this.designer.editor?.eventBus.on(EDITOR_EVENT.NODE_VISIBLE_CHANGE, fn);
173+
174+
return () => {
175+
this.designer.editor?.eventBus.off(EDITOR_EVENT.NODE_VISIBLE_CHANGE, fn);
176+
};
177+
}
178+
161179
@obx.shallow private willPurgeSpace: Node[] = [];
162180

163181
get modalNode() {

packages/designer/src/document/node/node.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
IPublicModelNode,
1717
IPublicModelExclusiveGroup,
1818
IPublicEnumTransformStage,
19+
EDITOR_EVENT,
1920
} from '@alilc/lowcode-types';
2021
import { compatStage, isDOMText, isJSExpression } from '@alilc/lowcode-utils';
2122
import { SettingTopEntry } from '@alilc/lowcode-designer';
@@ -193,6 +194,13 @@ export class Node<Schema extends IPublicTypeNodeSchema = IPublicTypeNodeSchema>
193194

194195
this.isInited = true;
195196
this.emitter = createModuleEventBus('Node');
197+
const editor = this.document.designer.editor;
198+
this.onVisibleChange((visible: boolean) => {
199+
editor?.eventBus.emit(EDITOR_EVENT.NODE_VISIBLE_CHANGE, this, visible);
200+
});
201+
this.onChildrenChange((info?: { type: string; node: Node }) => {
202+
editor?.eventBus.emit(EDITOR_EVENT.NODE_VISIBLE_CHANGE, info);
203+
});
196204
}
197205

198206
_settingEntry: SettingTopEntry;

packages/designer/tests/document/node/node.add.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { Node } from '../../../src/document/node/node';
66
import { Designer } from '../../../src/designer/designer';
77
import formSchema from '../../fixtures/schema/form';
88
import { getIdsFromSchema, getNodeFromSchemaById } from '../../utils';
9-
import { EBADF } from 'constants';
109

1110
const mockCreateSettingEntry = jest.fn();
1211
jest.mock('../../../src/designer/designer', () => {

packages/designer/tests/document/node/node.dragdrop.test.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
import set from 'lodash/set';
2-
import cloneDeep from 'lodash/cloneDeep';
31
import '../../fixtures/window';
42
import { Project } from '../../../src/project/project';
5-
import { Node } from '../../../src/document/node/node';
63
import { Designer } from '../../../src/designer/designer';
74
import formSchema from '../../fixtures/schema/form';
85
import { getIdsFromSchema, getNodeFromSchemaById } from '../../utils';

packages/designer/tests/document/node/node.modify.test.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
import set from 'lodash/set';
2-
import cloneDeep from 'lodash/cloneDeep';
31
import '../../fixtures/window';
42
import { Project } from '../../../src/project/project';
5-
import { Node } from '../../../src/document/node/node';
63
import { Designer } from '../../../src/designer/designer';
74
import formSchema from '../../fixtures/schema/form';
85
import { getIdsFromSchema, getNodeFromSchemaById } from '../../utils';

packages/designer/tests/document/node/node.remove.test.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ import set from 'lodash/set';
22
import cloneDeep from 'lodash/cloneDeep';
33
import '../../fixtures/window';
44
import { Project } from '../../../src/project/project';
5-
import { Node } from '../../../src/document/node/node';
65
import { Designer } from '../../../src/designer/designer';
76
import formSchema from '../../fixtures/schema/form';
8-
import { getIdsFromSchema, getNodeFromSchemaById } from '../../utils';
7+
import { getIdsFromSchema } from '../../utils';
98

109
const mockCreateSettingEntry = jest.fn();
1110
jest.mock('../../../src/designer/designer', () => {

packages/shell/src/api/project.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,6 @@ export class Project implements IPublicApiProject {
139139
*/
140140
importSchema(schema?: IPublicTypeProjectSchema): void {
141141
this[projectSymbol].load(schema, true);
142-
// this[editorSymbol].emit(Events.IMPORT_SCHEMA, schema);
143142
}
144143

145144
/**

packages/shell/src/model/document-model.ts

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -288,28 +288,23 @@ export class DocumentModel implements IPublicModelDocumentModel {
288288
* @param fn
289289
*/
290290
onChangeNodeVisible(fn: (node: IPublicModelNode, visible: boolean) => void): void {
291-
// TODO: history 变化时需要重新绑定
292-
this[documentSymbol].nodesMap?.forEach((node) => {
293-
node.onVisibleChange((flag: boolean) => {
294-
fn(Node.create(node)!, flag);
295-
});
291+
this[documentSymbol].onChangeNodeVisible((node: IPublicModelNode, visible: boolean) => {
292+
fn(Node.create(node)!, visible);
296293
});
297294
}
298295

299296
/**
300297
* 当前 document 的节点 children 变更事件
301298
* @param fn
302299
*/
303-
onChangeNodeChildren(fn: (info?: IPublicOnChangeOptions) => void): void {
304-
// TODO: history 变化时需要重新绑定
305-
this[documentSymbol].nodesMap?.forEach((node) => {
306-
node.onChildrenChange((info?: InnerOnChangeOptions) => {
307-
return info
308-
? fn({
309-
type: info.type,
310-
node: Node.create(node)!,
311-
})
312-
: fn();
300+
onChangeNodeChildren(fn: (info: IPublicOnChangeOptions) => void): void {
301+
this[documentSymbol].onChangeNodeChildren((info?: IPublicOnChangeOptions) => {
302+
if (!info) {
303+
return;
304+
}
305+
fn({
306+
type: info.type,
307+
node: Node.create(info.node)!,
313308
});
314309
});
315310
}

packages/types/src/editor.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,3 +173,9 @@ export interface PluginStatus {
173173
export interface PluginStatusSet {
174174
[key: string]: PluginStatus;
175175
}
176+
177+
export enum EDITOR_EVENT {
178+
NODE_CHILDREN_CHANGE = 'node.children.change',
179+
180+
NODE_VISIBLE_CHANGE = 'node.visible.change',
181+
}

packages/types/src/shell/model/document-model.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { IPublicTypeRootSchema, IPublicTypeDragNodeDataObject, IPublicTypeDragNo
22
import { IPublicEnumTransformStage } from '../enum';
33
import { IPublicApiProject } from '../api';
44
import { IPublicModelDropLocation, IPublicModelDetecting, IPublicModelNode, IPublicModelSelection, IPublicModelHistory, IPublicModelModalNodesManager } from './';
5+
import { IPublicOnChangeOptions } from '@alilc/lowcode-types';
56

67
export interface IPublicModelDocumentModel {
78

@@ -168,6 +169,12 @@ export interface IPublicModelDocumentModel {
168169
onChangeNodeVisible(fn: (node: IPublicModelNode, visible: boolean) => void): void;
169170

170171

172+
/**
173+
* 当前 document 的节点 children 变更事件
174+
* @param fn
175+
*/
176+
onChangeNodeChildren(fn: (info: IPublicOnChangeOptions) => void): void;
177+
171178
/**
172179
* 当前 document 节点属性修改事件
173180
* @param fn

0 commit comments

Comments
 (0)