antvis / G6

♾ A Graph Visualization Framework in JavaScript.
https://g6.antv.antgroup.com/
MIT License
11.05k stars 1.31k forks source link

graph.getZoom() 为啥会返回NAN #2369

Closed ghost closed 3 years ago

ghost commented 3 years ago

需求是要做个类似百度地图缩放显示下一级城市的效果. 我的实现是这样的. 1, 在 wheelzoom 中监听缩放事件, 通过判断 graph.getZoom() 的的值 来切换数据, 切换数据的时候, 重置缩放率到1.

但是现在出现了一个问题: 就是我 调用 graph.zoomTo(1.0) 之后, 在 wheelzoom 中通过 graph.getZoom() 获取缩放率 是个 NAN.

为啥 会出现这项的问题呢.

截屏2020-12-01 上午10 22 09 截屏2020-12-01 上午10 22 14
Yanyan-Wang commented 3 years ago

图形中存在非法值,例如 text 图形的 text 属性的值是 undefined null 等,或者其他 x y width height r rx ry 这些属性有 undefined null 之类的

ghost commented 3 years ago

我没有用复杂的node啊. 你看:

截屏2020-12-01 上午10 35 38 截屏2020-12-01 上午10 35 53
Yanyan-Wang commented 3 years ago

你写一个在线 demo 我看下吧,这样看不出是啥问题

baizn commented 3 years ago

setZoom方法里面做了什么,传入的 value 是否正确?

ghost commented 3 years ago

https://codesandbox.io/s/peaceful-austin-612vp?file=/src/App.js

你写一个在线 demo 我看下吧,这样看不出是啥问题 这是样例: https://codesandbox.io/s/peaceful-austin-612vp?file=/src/App.js

Yanyan-Wang commented 3 years ago

https://codesandbox.io/s/peaceful-austin-612vp?file=/src/App.js

你写一个在线 demo 我看下吧,这样看不出是啥问题 这是样例: https://codesandbox.io/s/peaceful-austin-612vp?file=/src/App.js

这个 demo 怎么操作会出现问题?我缩放没问题来着

ghost commented 3 years ago

https://codesandbox.io/s/peaceful-austin-612vp?file=/src/App.js

你写一个在线 demo 我看下吧,这样看不出是啥问题 这是样例: https://codesandbox.io/s/peaceful-austin-612vp?file=/src/App.js

这个 demo 怎么操作会出现问题?我缩放没问题来着

操作步骤: 1, mouseenter 到 P1节点 截屏2020-12-02 下午4 05 34 2, 放大canvas, 加载子节点 截屏2020-12-02 下午4 05 43

3, 然后 缩小canvas, 想退回到上级节点. 就出问题了. graph.getZoom() 返回 NAN 导致我没有办法判断当前时候是缩小操作. 截屏2020-12-02 下午4 05 51

4, 代码判断canvas放大缩小 加载节点逻辑: 截屏2020-12-02 下午4 09 41

Yanyan-Wang commented 3 years ago

graph.zoomTo(1.0, { x: curHoverNode.x, y: curHoverNode.y });

这里的 curHoverNode 有两个问题:

  1. curHoverNode 是 item,不能直接取 x y,应该拿到数据模型后拿 x y:curHoverNode.getModel().x
  2. 这里在 changeData 之后发生,changeData 会销毁之前的 item,所以 curHoverNode 被销毁了,你可以打印出来看,_cfg 是 null,是否被销毁可以用 curHoverNode.destroyed 来判断。所以应该在 changeData 之前记录 x y,并在这里使用,而不是在这里再拿被销毁的节点的 x y