Loading...
连线交互规则都是通过 connecting
配置来完成,完整的配置参考 API。下面介绍一些常用的功能。
可以通过 allowXXX
配置来定义连线能否连接到对应的位置。默认支持以下项:
allowBlank
:是否允许连接到画布空白位置的点,默认为 true
。allowLoop
:是否允许创建循环连线,即边的起始节点和终止节点为同一节点,默认为 true
。allowNode
:是否允许边连接到节点(非节点上的连接桩),默认为 true
。allowEdge
:是否允许边连接到另一个边,默认为 true
。allowPort
:是否允许边连接到连接桩,默认为 true
。allowMulti
:是否允许在相同的起始节点和终止之间创建多条边,默认为 true
。它们的值都支持以下两种类型:
new Graph({connecting: {allowNode: true, // boolean},})// 函数形式,多用于动态控制连接限制new Graph({connecting: {allowNode(args) {return true},},})
allowMulti
支持设置为字符串 withPort
,代表在起始和终止节点的相同连接桩之间只允许创建一条边(即起始和终止节点之间可以创建多条边,但必须要连接在不同的连接桩上)。
在边教程中我们知道,可以在添加边的时候指定 router
和 connector
,如果整个画布中大部分边的 router
或者 connector
是一样的,我们可以直接配置在 connecting
中,这样就可以避免在边中重复配置。
new Graph({connecting: {router: 'orth',connector: 'rounded',},})
在上面的 demo 中,我们可以从节点、连接桩拉出一条连线出来,那你可能会问,什么样的元素能拉出连线呢?这是 X6 设计非常巧妙的一个地方,只要具备 magnet=true
属性的元素,都可以拉出连线。而且在 connecting
中可以通过 createEdge
方法配置拉出连线的样式。
new Graph({connecting: {createEdge() {return this.createEdge({shape: 'edge',attrs: {line: {stroke: '#8f8f8f',strokeWidth: 1,},},})},},})
我们还可以通过 validateXXX
方法来定义是否能创建连线或者连线是否有效。相比 allowXXX
,validateXXX
更具备灵活性。默认支持以下项:
validateMagnet
:点击 magnet=true
的元素时 根据 validateMagnet
返回值来判断是否新增边,触发时机是元素被按下,如果返回 false
,则没有任何反应,如果返回 true
,会在当前元素创建一条新的边。validateConnection
:在移动边的时候判断连接是否有效,如果返回 false
,当鼠标放开的时候,不会连接到当前元素,常常配合高亮功能一起使用。validateEdge
:当停止拖动边的时候根据 validateEdge
返回值来判断边是否生效,如果返回 false
, 该边会被清除。有时候我们需要将一个节点拖动到另一个节点中,使其成为另一节点的子节点,这时我们可以通过 embedding
选项来开启,在节点被移动时通过 findParent
指定的方法返回父节点。更详细的配置参考 API。
const graph = new Graph({embedding: {enabled: true,findParent({ node }) {// 获取移动节点的包围盒const bbox = node.getBBox()// 找到 data 中配置 { parent: true } 的节点,并且移动节点和找到的节点包围盒相交时,返回 truereturn this.getNodes().filter((node) => {const data = node.getData<{ parent: boolean }>()if (data && data.parent) {const targetBBox = node.getBBox()return bbox.isIntersectWithRect(targetBBox)}return false})},},})
可以通过 highlighting
选项来指定触发某种交互时的高亮样式,如:
new Graph({highlighting: {// 连接桩可以被连接时在连接桩外围围渲染一个包围框magnetAvailable: {name: 'stroke',args: {attrs: {fill: '#fff',stroke: '#A4DEB1',strokeWidth: 4,},},},// 连接桩吸附连线时在连接桩外围围渲染一个包围框magnetAdsorbed: {name: 'stroke',args: {attrs: {fill: '#fff',stroke: '#31d0c6',strokeWidth: 4,},},},},})
支持的 highlighting
配置项有:
default
默认高亮选项,当以下几种高亮配置缺省时被使用。embedding
拖动节点进行嵌入操作过程中,节点可以被嵌入时被使用。nodeAvailable
连线过程中,节点可以被链接时被使用。magnetAvailable
连线过程中,连接桩可以被链接时被使用。magnetAdsorbed
连线过程中,自动吸附到连接桩时被使用。上面 magnetAvailable.name
其实是高亮器的名称,X6 内置了 stroke
和 className
两种高亮器,详细信息参考 Highlighter。
可以通过配置 interacting
来启动、禁用一些元素的交互行为,如果画布上元素纯预览,不能进行任何交互,可以直接设置为 false
。
new Graph({interacting: false,})
如果需要更细节的定义允许哪些交互、禁用哪些交互,我们可以针对不同的属性值进行配置,支持的属性包括:
nodeMovable
节点是否可以被移动。magnetConnectable
当在具有 magnet
属性的元素上按下鼠标开始拖动时,是否触发连线交互。edgeMovable
边是否可以被移动。edgeLabelMovable
边的标签是否可以被移动。arrowheadMovable
边的起始/终止箭头(在使用 arrowhead 工具后)是否可以被移动。vertexMovable
边的路径点是否可以被移动。vertexAddable
是否可以添加边的路径点。vertexDeletable
边的路径点是否可以被删除。它们的值都支持以下两种类型:
// 直接设置为 boolean 值new Graph({interacting: {nodeMovable: false,edgeMovable: true,},})// 函数形式,多用于动态控制交互行为new Graph({interacting: {nodeMovable(view) {const node = view.cellconst { enableMove } = node.getData()return enableMove},},})