-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(extension): 【dynamic-group】修复mousemove和isCollapsed相关问题 #1919
Conversation
|
d54c861
to
86eaf98
Compare
需要我把这个代码也提交上去吗? |
哈哈哈,有点好笑了,我之前开发 dynamic-group 用的是 engine-browser-examples 这个项目,然后代码没有同步过来。。 没事,你不管了,我把这个 PR 过了,我去同步代码 |
fix #1912
fix #1914
fix #1918
#1912
问题发生的原因
下面视频展示的关系为:dynamicGroupA嵌套dynamicGroupB,dynamicGroupB嵌套普通Node
由于dynamicGroupA嵌套dynamicGroupB,在dynamicGroupA进行折叠时,会触发dynamicGroupB的隐藏,从而触发dynamicGroupB的
componentWillUnmount()
销毁,但是如下面视频所示,dynamicGroupB的componentDidMount()
注册了很多事件:但是忘记执行对应的事件移除,因此导致每一次折叠=>展开的时候,都会重复注册一次事件,因此导致下面视频所展示触发多次
moveNodes
,也就是dynamicGroupB移动1px,会触发多次它的children的1px
移动,从而造成移动错乱问题on-off.mp4
解决方法
将componentDidMount注册的监听事件方法抽离出来,为后面解除事件监听做准备
交互逻辑无变化,只是将注册方法抽离为
this.xxxx
方法,放在外部componentWillUnmount移除监听
#1914
问题发生的原因
在#1858改变了
group移动时,移动时需要同时移动组内的所有节点
的逻辑代码,原来2.0.8
版本中的逻辑是:在
2.0.9
版本中的逻辑是是因为
onDragging()
->会进行坐标的处理,其中包括了SCALE
的转化->触发addNodeMoveRules的注册的监听方法,也就是上面的2.0.8
版本中的逻辑的graphModel.moveNodes()
,此时的deltaX
和deltaY
是经过SCALE
后的数据2.0.9
版本中的mousemove
回调是跟onDragging()
同时发生的,拿到的deltaX
和deltaY
是没有经过SCALE
后的数据解决方法
deltaX
和deltaY
增加SCALE
的转化#1918
问题发生的原因
在
packages/extension/src/dynamic-group/model.ts
中有这么一段代码初始化时主动触发一次折叠操作是没问题的,但是我们从
toggleCollapse
可以知道,我们是通过elementsModelMap
去获取对应的数据,但是存在着group已经初始化完成,但是children还没初始化的情况
,这个时候elementsModelMap
是找不到children
数据的当我们使用上面的数据进行渲染时,会触发
getModelAfterSnapToGrid()
,然后触发group
的new Model()
,从而触发model.setAttributes()
->toggleCollapse()
->使用elementsModelMap
寻找对应的childrenId
对应的Model
,此时找不到children
的Model
,因为要等待group
初始化好了,再执行children
的new Model()
,然后将children
的Model
放入到elementsModelMap
中因此只要把数据翻转,也就是下面的顺序,先渲染
children
->group
,那么一切就正常了!解决方法
将初始化时主动触发一次折叠操作放在全部渲染完成之后再执行,也就是