alibaba / lowcode-engine

An enterprise-class low-code technology stack with scale-out design / 一套面向扩展设计的企业级低代码技术体系
https://lowcode-engine.cn
MIT License
14.68k stars 2.55k forks source link

【咨询】是否有完全销毁document的方式 #2181

Open zboMa opened 1 year ago

zboMa commented 1 year ago

问题

采用openDocument和removeDocument的方式切换schema,发现document并没有完全销毁。 旧有的document上绑定的监听事件,仍旧在运转。 例如doc.onAddNode()等。

并且,配置面板的修改,仍旧会触发旧有的doc的onChangeNodeProp,这造成了数据混乱。

补充

版本:1.1.6

zboMa commented 1 year ago

问题如下:

  1. 由于project.removeDocument没有执行documentModel的purge操作,所以并没有实际销毁document,只是断开了连接。
  2. document中的purge操作,没有调用emitter.removeAllListeners,也没有销毁相关实例,所以事件仍在运转。
  3. emitter.removeAllListeners中,将undefined值仍旧传递进了event Emmiter中,eventEmmiter中判断的是参数长度,所以传undefined并不会清除任何事件,所以当eventName不存在的时候需要不传参数。
  4. shell的document-model中的 onChangeNodeProp监听的是prop发出的事件,此事件无差别发送,并未绑定本document,所以其他document中的prop发出的事件也会被本document捕获并执行,所以既然是document监听的,理应判断是否是本document中的节点发送的,然后再执行fn()。

以上,基于版本 1.1.6。

liujuping commented 1 year ago

目前没有完全销毁 document 的 api,可以使用这个 api 监听 document remove 事件并移除绑定的事件

https://lowcode-engine.cn/site/docs/api/project#onremovedocument