背景
- 创建一个流程图,一方面需要通过接口获取流程图的基本信息来绘制流程图,一方面可通过连接流程图节点的端点来添加线段。
- 节点的创建通过拖动原型复制。
- 节点的可连接线段端点有四个,分别为topCenter/bottomCenter/leftMiddle/rightMiddle
- 节点连接线段的规则为:同一节点不可连接,每个端点连接线段不做限制
引入包
npm install jsplumb --save
创建jsPlumb对象
if (!this.jsPlumbInstance) {
this.jsPlumbInstance = jsPlumb.getInstance() // 创建一个jsPlumb对象
}
注册事件
- beforeDrop
连接线段或删除线段会触发此事件,即线段的变动触发。
此处用于判断用户连接的两个节点是否符合连接规则,如果符合返回true,该条线段连接成功;
如不符合返回false,该条线段连接不成功
this.jsPlumbInstance.bind('beforeDrop', (info) => {
// info是该线段的基本信息 sourceId是线头节点id,targetId是线尾节点id
if (info.sourceId == info.targetId) { // 判断是否是同一节点
return false
}
let sourceId = info.sourceId
let targetId = info.targetId
let sourceKey = info.connection['endpoints'][0].anchor.type // 连接的位置获取
let targetKey = info.dropEndpoint.anchor.type // 连接的位置获取
for (let i = 0; i < this.pointList.length; i++) { // 将连接的信息放入节点列表的对应节点中
let item = this.pointData[i]
if (item.id == sourceId) {
if (item.target.length) {
for (let j = 0; j < item.target.length; j++) { // 判断是否有重复连接,如果有且连接位置不同,则保存,如果位置相同则不保存
let targetIndex = item.target[j]
if (targetIndex.id == targetId && targetIndex.anchors[0]