tonywu6

Results 19 comments of tonywu6

见 Graph 配置 > `connecting` > [`allowLoop` 配置](https://x6.antv.vision/zh/docs/tutorial/basic/interacting#allowloop) ```js const graph = new Graph({ connecting: { allowLoop: false, // forbids self edges } }) ```

这里猜测你想要这个图是一个无环图?也就说所有的 Edge 不能形成一个环路? 如果是的话,目前 X6 本身没有开箱即用的支持,但是可以通过为 Graph 配置中的 connecting 配置提供 [`validateConnection` 函数](https://x6.antv.vision/zh/docs/api/graph/interaction/#validateconnection)进行判断; 这里有一个之前我使用过的用于这一目的的函数 **(仅供参考,对时间/空间复杂度不作考虑)** ```ts /** * Check if the graph will have (or already has) a cycle if there...

目前观察到的情况是,在「把 innerBox 拖拽进 outterBox」这一过程结束后的瞬间 (immediately after),即鼠标松开时,在 history 中推入了三组操作,每组中都仅有一个操作,它们分别是位移、更新 innerBox parent、更新 outerBox children ```tsx ["cell:change:position"] ["cell:change:parent"] ["cell:change:children"] ``` 这里认为,在理想的情况下,这里应当推入**一**组操作,在这组操作中包含所有发生的事件 ```tsx ["cell:change:position", "cell:change:parent", "cell:change:children"] ``` 这时 `undo()` 一次(点击一次撤销)即可将画布还原为「节点位移」前的状态 Edit: typos

如上 @DanielLeefu 提到:配置 [`allowBlank: true`](https://x6.antv.vision/zh/docs/tutorial/basic/interacting#allowblank), 然后为 Edge 添加 [`source-arrowhead` 和 `target-arrowhead` tools](https://x6.antv.vision/zh/docs/api/registry/edge-tool#source-arrowhead-%E5%92%8C-target-arrowhead) [Demo](https://codesandbox.io/s/antv-x6-source-target-arrowhead-9tq56g?file=/src/index.ts:908-955)

https://codesandbox.io/s/antv-x6-manhattan-routing-edge-tools-w67o06?file=/src/app.tsx 推测是线段工具不能很好地兼容 manhattan 路由

这里是希望拖拽过程中或者拖拽结束后异步地配置 Node 信息吗 如果只是希望对最终添加到图上的节点进行异步配置,在暂时不支持 async 的情况下,可以考虑 - 通过 getDropNode 同步地生成一个暂时性的节点,然后通过事件 `node:added` 在事件函数里进行异步操作?或者 - (比较不优雅的,带副作用的方法)[`validateNode` 支持返回 `Promise`](https://x6.antv.vision/zh/docs/tutorial/basic/dnd/#step-1-%E5%88%9D%E5%A7%8B%E5%8C%96), 那么在 `validateNode` 中[直接对 `droppingNode` 进行修改?](https://codesandbox.io/s/antv-x6-drag-and-drop-abusing-validatenode-3j1gsw?file=/src/app.tsx:2274-2753)

> 这里如果是请求接口动态生成节点,那么,正确的逻辑应该是让validateNode永远返回false,x6会自动删除那个droppingNode。 但是如果是仅仅设置成 false 的话,在交互上给使用者呈现的视觉效果会变成 **drag and drop 没有成功**,尤其是异步过程用时较长的话,看起来就是“好像没拖拽成功,但是其实最后成功了”(基本上 >200ms 即会有明显的感知) 其实从 UX 视角来看,拖拽事件和其他鼠标事件一样,属于需要迅速完成反应的事件;在这里对于框架一个很现实的问题是:如果 `getDropNode` 允许异步运行,那么从 `pending` 到 `resolve` 这一段长度我们不可预知的时间内,图处于一个什么状态?我们可以显示什么?我们怎么样向使用者传递“正在添加节点”的信息? 现在这些考量是交给开发者,比如开发者可以先生成一个临时的 node, 再通过事件异步过程完成后,再更新这个临时的节点;或者像官网文档的示例那样,在 `validateNode` 里给 `droppingNode` 添加一个 spinner, 并且在异步结束后取消这个 spinner...

Hello! Snapline 的 `sharp` 选项计划在未来的一个版本中会被去除,届时 `sharp: true` 将会成为默认的行为,也就是说对齐线将会默认对齐各个节点; 这样做的原因是 Snapline 在 1.32.7 引入了新的渲染方式,去除了 jQuery 的使用并解决了之前的一个性能问题,其中默认 `sharp: true` 的做法反而在代码设计及性能上比复原 `sharp: false` 更占优势,加之我们认为 `sharp: true` 在 UI 上也更加友好,因为此时可以看出某个节点具体是和哪些其他的节点对齐的,因此我们采取了弃用的策略。 具体的 PR 内容可见 #2195...

这里猜测你想要拿到的是单纯的「单击了哪一个链接桩」,而不是「哪两个链接桩被连接起来」;如果是想要获取连接的信息,可以监听 [`edge:connected`](https://x6.antv.vision/zh/docs/tutorial/intermediate/events#%E8%BE%B9%E8%BF%9E%E6%8E%A5%E5%8F%96%E6%B6%88%E8%BF%9E%E6%8E%A5) --- 对于自定义事件:确保事件的名称在声明处和监听处是完全相同 ```tsx portNameLabel: { // ..., event: "node:port-click" } graph.on("node:port-click", /* ... */) ``` 对于如何获得 port 本身的点击事件,这里有一个可以监听节点事件(你的 demo 的做法),然后通过 `Event.currentTarget.parentElement` 获得链接桩对应的 SVG 元素的 parent 元素,这个 parent 元素是一个...