diff --git a/packages/designer/src/builtin-simulator/host.ts b/packages/designer/src/builtin-simulator/host.ts index 1a5d12cfd..7ad6547bb 100644 --- a/packages/designer/src/builtin-simulator/host.ts +++ b/packages/designer/src/builtin-simulator/host.ts @@ -17,7 +17,7 @@ import { } from '../simulator'; import Viewport from './viewport'; import { createSimulator } from './create-simulator'; -import { Node, ParentalNode, contains, isRootNode } from '../document'; +import { Node, ParentalNode, contains, isRootNode, isLowCodeComponent } from '../document'; import ResourceConsumer from './resource-consumer'; import { AssetLevel, @@ -792,7 +792,7 @@ export class BuiltinSimulatorHost implements ISimulatorHost void): () => void { + this.emitter.on('metadata_change', fn); + return () => { + this.emitter.removeListener('metadata_change', fn); + }; + } + // compatiable vision prototype?: any; } diff --git a/packages/designer/src/designer/setting/setting-top-entry.ts b/packages/designer/src/designer/setting/setting-top-entry.ts index ab09d355c..6e03cc66a 100644 --- a/packages/designer/src/designer/setting/setting-top-entry.ts +++ b/packages/designer/src/designer/setting/setting-top-entry.ts @@ -80,6 +80,8 @@ export class SettingTopEntry implements SettingEntry { // clear fields this.setupItems(); + + this.setupEvents(); } private setupComponentMeta() { @@ -120,6 +122,12 @@ export class SettingTopEntry implements SettingEntry { } } + private setupEvents() { + this.componentMeta?.onMetadataChange(() => { + this.setupItems(); + }); + } + /** * 获取当前属性值 */ diff --git a/packages/designer/src/document/node/node.ts b/packages/designer/src/document/node/node.ts index 9a35e8ceb..9dfde4baf 100644 --- a/packages/designer/src/document/node/node.ts +++ b/packages/designer/src/document/node/node.ts @@ -156,8 +156,6 @@ export class Node { return this.componentMeta.icon; } - readonly settingEntry: SettingTopEntry; - private isInited = false; constructor(readonly document: DocumentModel, nodeSchema: Schema, options: any = {}) { @@ -168,13 +166,11 @@ export class Node { this.props = new Props(this, { children: isDOMText(children) || isJSExpression(children) ? children : '', }); - this.settingEntry = this.document.designer.createSettingEntry([this]); } else { // 这里 props 被初始化两次,一次 new,一次 import,new 的实例需要给 propsReducer 的钩子去使用, // import 是为了使用钩子返回的值,并非完全幂等的操作,部分行为执行两次会有 bug, // 所以在 props 里会对 new / import 做一些区别化的解析 this.props = new Props(this, props, extras); - this.settingEntry = this.document.designer.createSettingEntry([this]); this._children = new NodeChildren(this as ParentalNode, this.initialChildren(children)); this._children.internalInitParent(); this.props.import( @@ -188,6 +184,14 @@ export class Node { this.emitter = new EventEmitter(); } + _settingEntry: SettingTopEntry; + + get settingEntry(): SettingTopEntry { + if (this._settingEntry) return this._settingEntry; + this._settingEntry = this.document.designer.createSettingEntry([this]); + return this._settingEntry; + } + private initProps(props: any): any { return this.document.designer.transformProps(props, this, TransformStage.Init); } @@ -1091,6 +1095,10 @@ export function isRootNode(node: Node): node is RootNode { return node && node.isRoot(); } +export function isLowCodeComponent(node: Node): boolean { + return node.componentMeta.getMetadata().devMode === 'lowcode'; +} + export function getZLevelTop(child: Node, zLevel: number): Node | null { let l = child.zLevel; if (l < zLevel || zLevel < 0) {