fix: fix onChangeNodeVisible & onChangeNodeChildren cannot be triggered successfully in some cases

This commit is contained in:
liujuping 2023-01-03 15:30:58 +08:00 committed by 林熠
parent 8d2fe15a3f
commit 9444752a65
10 changed files with 50 additions and 25 deletions

View File

@ -15,6 +15,8 @@ import {
IPublicApiProject, IPublicApiProject,
IPublicModelDropLocation, IPublicModelDropLocation,
IPublicEnumTransformStage, IPublicEnumTransformStage,
IPublicOnChangeOptions,
EDITOR_EVENT,
} from '@alilc/lowcode-types'; } from '@alilc/lowcode-types';
import { Project } from '../project'; import { Project } from '../project';
import { ISimulatorHost } from '../simulator'; import { ISimulatorHost } from '../simulator';
@ -158,6 +160,22 @@ export class DocumentModel implements IDocumentModel {
this.inited = true; this.inited = true;
} }
onChangeNodeVisible(fn: (node: IPublicModelNode, visible: boolean) => void): () => void {
this.designer.editor?.eventBus.on(EDITOR_EVENT.NODE_CHILDREN_CHANGE, fn);
return () => {
this.designer.editor?.eventBus.off(EDITOR_EVENT.NODE_CHILDREN_CHANGE, fn);
};
}
onChangeNodeChildren(fn: (info: IPublicOnChangeOptions) => void): () => void {
this.designer.editor?.eventBus.on(EDITOR_EVENT.NODE_VISIBLE_CHANGE, fn);
return () => {
this.designer.editor?.eventBus.off(EDITOR_EVENT.NODE_VISIBLE_CHANGE, fn);
};
}
@obx.shallow private willPurgeSpace: Node[] = []; @obx.shallow private willPurgeSpace: Node[] = [];
get modalNode() { get modalNode() {

View File

@ -16,6 +16,7 @@ import {
IPublicModelNode, IPublicModelNode,
IPublicModelExclusiveGroup, IPublicModelExclusiveGroup,
IPublicEnumTransformStage, IPublicEnumTransformStage,
EDITOR_EVENT,
} from '@alilc/lowcode-types'; } from '@alilc/lowcode-types';
import { compatStage, isDOMText, isJSExpression } from '@alilc/lowcode-utils'; import { compatStage, isDOMText, isJSExpression } from '@alilc/lowcode-utils';
import { SettingTopEntry } from '@alilc/lowcode-designer'; import { SettingTopEntry } from '@alilc/lowcode-designer';
@ -193,6 +194,13 @@ export class Node<Schema extends IPublicTypeNodeSchema = IPublicTypeNodeSchema>
this.isInited = true; this.isInited = true;
this.emitter = createModuleEventBus('Node'); this.emitter = createModuleEventBus('Node');
const editor = this.document.designer.editor;
this.onVisibleChange((visible: boolean) => {
editor?.eventBus.emit(EDITOR_EVENT.NODE_VISIBLE_CHANGE, this, visible);
});
this.onChildrenChange((info?: { type: string; node: Node }) => {
editor?.eventBus.emit(EDITOR_EVENT.NODE_VISIBLE_CHANGE, info);
});
} }
_settingEntry: SettingTopEntry; _settingEntry: SettingTopEntry;

View File

@ -6,7 +6,6 @@ import { Node } from '../../../src/document/node/node';
import { Designer } from '../../../src/designer/designer'; import { Designer } from '../../../src/designer/designer';
import formSchema from '../../fixtures/schema/form'; import formSchema from '../../fixtures/schema/form';
import { getIdsFromSchema, getNodeFromSchemaById } from '../../utils'; import { getIdsFromSchema, getNodeFromSchemaById } from '../../utils';
import { EBADF } from 'constants';
const mockCreateSettingEntry = jest.fn(); const mockCreateSettingEntry = jest.fn();
jest.mock('../../../src/designer/designer', () => { jest.mock('../../../src/designer/designer', () => {

View File

@ -1,8 +1,5 @@
import set from 'lodash/set';
import cloneDeep from 'lodash/cloneDeep';
import '../../fixtures/window'; import '../../fixtures/window';
import { Project } from '../../../src/project/project'; import { Project } from '../../../src/project/project';
import { Node } from '../../../src/document/node/node';
import { Designer } from '../../../src/designer/designer'; import { Designer } from '../../../src/designer/designer';
import formSchema from '../../fixtures/schema/form'; import formSchema from '../../fixtures/schema/form';
import { getIdsFromSchema, getNodeFromSchemaById } from '../../utils'; import { getIdsFromSchema, getNodeFromSchemaById } from '../../utils';

View File

@ -1,8 +1,5 @@
import set from 'lodash/set';
import cloneDeep from 'lodash/cloneDeep';
import '../../fixtures/window'; import '../../fixtures/window';
import { Project } from '../../../src/project/project'; import { Project } from '../../../src/project/project';
import { Node } from '../../../src/document/node/node';
import { Designer } from '../../../src/designer/designer'; import { Designer } from '../../../src/designer/designer';
import formSchema from '../../fixtures/schema/form'; import formSchema from '../../fixtures/schema/form';
import { getIdsFromSchema, getNodeFromSchemaById } from '../../utils'; import { getIdsFromSchema, getNodeFromSchemaById } from '../../utils';

View File

@ -2,10 +2,9 @@ import set from 'lodash/set';
import cloneDeep from 'lodash/cloneDeep'; import cloneDeep from 'lodash/cloneDeep';
import '../../fixtures/window'; import '../../fixtures/window';
import { Project } from '../../../src/project/project'; import { Project } from '../../../src/project/project';
import { Node } from '../../../src/document/node/node';
import { Designer } from '../../../src/designer/designer'; import { Designer } from '../../../src/designer/designer';
import formSchema from '../../fixtures/schema/form'; import formSchema from '../../fixtures/schema/form';
import { getIdsFromSchema, getNodeFromSchemaById } from '../../utils'; import { getIdsFromSchema } from '../../utils';
const mockCreateSettingEntry = jest.fn(); const mockCreateSettingEntry = jest.fn();
jest.mock('../../../src/designer/designer', () => { jest.mock('../../../src/designer/designer', () => {

View File

@ -139,7 +139,6 @@ export class Project implements IPublicApiProject {
*/ */
importSchema(schema?: IPublicTypeProjectSchema): void { importSchema(schema?: IPublicTypeProjectSchema): void {
this[projectSymbol].load(schema, true); this[projectSymbol].load(schema, true);
// this[editorSymbol].emit(Events.IMPORT_SCHEMA, schema);
} }
/** /**

View File

@ -288,11 +288,8 @@ export class DocumentModel implements IPublicModelDocumentModel {
* @param fn * @param fn
*/ */
onChangeNodeVisible(fn: (node: IPublicModelNode, visible: boolean) => void): void { onChangeNodeVisible(fn: (node: IPublicModelNode, visible: boolean) => void): void {
// TODO: history 变化时需要重新绑定 this[documentSymbol].onChangeNodeVisible((node: IPublicModelNode, visible: boolean) => {
this[documentSymbol].nodesMap?.forEach((node) => { fn(Node.create(node)!, visible);
node.onVisibleChange((flag: boolean) => {
fn(Node.create(node)!, flag);
});
}); });
} }
@ -300,16 +297,14 @@ export class DocumentModel implements IPublicModelDocumentModel {
* document children * document children
* @param fn * @param fn
*/ */
onChangeNodeChildren(fn: (info?: IPublicOnChangeOptions) => void): void { onChangeNodeChildren(fn: (info: IPublicOnChangeOptions) => void): void {
// TODO: history 变化时需要重新绑定 this[documentSymbol].onChangeNodeChildren((info?: IPublicOnChangeOptions) => {
this[documentSymbol].nodesMap?.forEach((node) => { if (!info) {
node.onChildrenChange((info?: InnerOnChangeOptions) => { return;
return info }
? fn({ fn({
type: info.type, type: info.type,
node: Node.create(node)!, node: Node.create(info.node)!,
})
: fn();
}); });
}); });
} }

View File

@ -173,3 +173,9 @@ export interface PluginStatus {
export interface PluginStatusSet { export interface PluginStatusSet {
[key: string]: PluginStatus; [key: string]: PluginStatus;
} }
export enum EDITOR_EVENT {
NODE_CHILDREN_CHANGE = 'node.children.change',
NODE_VISIBLE_CHANGE = 'node.visible.change',
}

View File

@ -2,6 +2,7 @@ import { IPublicTypeRootSchema, IPublicTypeDragNodeDataObject, IPublicTypeDragNo
import { IPublicEnumTransformStage } from '../enum'; import { IPublicEnumTransformStage } from '../enum';
import { IPublicApiProject } from '../api'; import { IPublicApiProject } from '../api';
import { IPublicModelDropLocation, IPublicModelDetecting, IPublicModelNode, IPublicModelSelection, IPublicModelHistory, IPublicModelModalNodesManager } from './'; import { IPublicModelDropLocation, IPublicModelDetecting, IPublicModelNode, IPublicModelSelection, IPublicModelHistory, IPublicModelModalNodesManager } from './';
import { IPublicOnChangeOptions } from '@alilc/lowcode-types';
export interface IPublicModelDocumentModel { export interface IPublicModelDocumentModel {
@ -168,6 +169,12 @@ export interface IPublicModelDocumentModel {
onChangeNodeVisible(fn: (node: IPublicModelNode, visible: boolean) => void): void; onChangeNodeVisible(fn: (node: IPublicModelNode, visible: boolean) => void): void;
/**
* document children
* @param fn
*/
onChangeNodeChildren(fn: (info: IPublicOnChangeOptions) => void): void;
/** /**
* document * document
* @param fn * @param fn