需求:
存在节点: 节点A,节点B,节点C (其中A,B是上一级节点,C是下一级节点)
原来的逻辑:gojs默认情况下是节点A和节点B都可以指向节点C,且可以同时指向节点C。
我想要的结果:节点C只能被节点A或节点B指向。
话不多比,上代码:
// 定义链接数据模型
myDiagram.linkTemplate =
goObj(go.Link,
{ routing: go.Link.Orthogonal, corner: 5 },
goObj(go.Shape, { stroke: "gray", strokeWidth: 2 })
);
// 约束条件:一个节点只能连接到另一个节点
myDiagram.toolManager.linkingTool.linkValidation = (fromNode, fromPort, toNode, toPort) => {
//toNode.linksConnected.count 是你这个节点有几条连接线,指和被指都算
if (toNode && toNode.linksConnected.count > 0) {
// 当目标节点已连接时,不允许链接
return false;
}
return true;
};
注意:通过上边这种逻辑限制的是只能有一个对外链接的线,进出都算,而且所有的节点都会被限制,不太对,得改。
改进:
在此基础上在做一层限制
只有在某一种节点才会限制对外连接的线。
使用的时判断toNode.Vd.className
// 定义链接数据模型
myDiagram.linkTemplate =
goObj(go.Link,
{ routing: go.Link.Orthogonal, corner: 5 },
goObj(go.Shape, { stroke: "gray", strokeWidth: 2 })
);
// 约束条件:一个节点只能连接到另一个节点
myDiagram.toolManager.linkingTool.linkValidation = (fromNode, fromPort, toNode, toPort) => {
//toNode.linksConnected.count 是你这个节点有几条连接线,指和被指都算
if (toNode && toNode.linksConnected.count > 0 && toNode.Vd.className = '你要限制节点的标识') {
// 当目标节点已连接时,不允许链接
return false;
}
return true;
};
把这个加上就可以单独限制某一个节点了。至于原理emmmm
话不多比,结束。