画布操作
| 作用 | api |
|---|---|
| 获取当前画布的 json | myDiagram.model.toJson() |
| 加载 json 刷新画布 | myDiagram.model = go.Model.fromJson(model) |
| 删除选中节点或线 | myDiagram.commandHandlr.deleteSelection() |
| 获取选中的节点或线 myDiagram.selection | - 用例获取选中的节点或线 var nodeOrLinkList = myDiagram.selection nodeOrLinkList.each((node) => { console.info(node.data) }) - 获取第一个选中的节点或线 var nodeOrLinkFirst = myDiagram.selection.first() |
| 获取画布所有节点对象 myDiagram.nodes | var nodes = myDiagram.nodes // 遍历输出节点对象 nodes.each((node) => { console.info(node.data.text) }) |
获取并操作选中元素也可以在监听选中项进行修改:
// 监听选中项
that.myDiagram.addDiagramListener("ChangedSelection", function (e, i) {
// console.log("重新选择了", e.myDiagram.lastInput.viewPoint);
// console.log("重新选择了", e.Lr.ea);
that.selectNode = [];
that.selectLink = [];
that.myDiagram.selection.each(function (part) {
if (part instanceof go.Node) {、
/* 获取所有的 Node 节点 */
that.selectNode.push(part.data);
} else if (part instanceof go.Link) {
/* 获取所有的 link 连线 */
that.selectLink.push(part.data);
}
});
});
节点操作
| 作用 | API |
|---|---|
| 添加节点 | myDiagram.model.addNodeData(node) |
| 删除节点 | myDiagram.model.removeNodeData(node) |
| 选中单个节点(不能批量选中) | myDiagram.select(node) |
| 更改节点属性 | myDiagram.model.setDataProperty(node, "color",'#000") (参数对应:要修改的节点、要修改的属性名、修改后的属性值) |
| 根据节点数据对象更改节点属性 myDiagram.model. updateTargetBindings (node) | var node = myDiagram.model. findNodeDataForKey('nodeKey') node.text = 'newText' node.color = 'pink' myDiagram.model.updateTargetBindings(node) |
| 获取节点对象 | let node = myDiagram.findNodeForKey('key') |
| 获取节点Data | let nodeData = myDiagram.model. findNodeDataForKey(‘key') |
| 批量删除节点 myDiagram.model. removeNodeDataCollection (nodes) | let removeNodes = [] let removeNode0 = myDiagram.model. findNodeDataForKey('key0') let removeNode1 = myDiagram.model. findNodeDataForKey('key1') removeNodes.push(removeNode0) removeNodes.push(removeNode0) myDiagram.model.removeNodeDataCollection(removeNodes) |
-
批量删除节点
let removeNodes = [] let removeNode0 = myDiagram.model.findNodeDataForKey('key0') let removeNode1 = myDiagram.model.findNodeDataForKey('key1') removeNodes.push(removeNode0) removeNodes.push(removeNode0) myDiagram.model.removeNodeDataCollection(removeNodes) -
模糊获取节点 (版本 1.68 以上):
myDiagram.findNodesByExample(data) /* 匹配方式默认为===运算符进行比较。 /abc/ 匹配包含“abc”的任何字符串 /abc/i 匹配包含“abc”的任何字符串,忽略大小写 /^no/i 匹配任何以“no”开头的字符串,忽略大小写 /ism$/匹配任何以“ism”结尾的字符串 /(green|red) apple/ 匹配包含“green apple”或“red apple”的字符串 要查询的值类型区分数字和字符串:比如json中是`90`,写成 90 会查询 */ let data = {}; data.text="设计"; // data.text=/设计/; // data.text=/设计/i; // data.text=/^设计/; // data.text=/设计$/; // data.text=/(勘|察)设计/; let nodes = myDiagram.findNodesByExample(data); nodes.iterator.each(function (node) { console.log(node.data); });
线
-
添加线:
myDiagram.model.addLinkData(linkData) -
删除线:
myDiagram.model.removeLinkData(linkData) -
批量删除线:
{ Array | iterator } removeLinks removeLinkDataCollection(removeLinks) / * 实现 */ let removeLinks = [] // 拿到节点对象 let node = myDiagram.findNodeForKey("key") // 获取节点所有线 node.findLinksConnected().each((link) => { removeLinks.push(link.data) }) myDiagram.model.removeLinkDataCollection(removeLinks) -
模糊获取线 (1.68版本以上):
myDiagram.findLinksByExample(data) // 匹配方式和模糊获取节点的规则一致 /* 实现 */ // 值区分数值和字符串,‘2.18’ 和 2.18 不同 let links = myDiagram.findLinksByExample({from:'1',to:'2'}) links.iterator.each((link) => { console.info(link.data) }) -
更改属性值:
myDiagram.model.setDataProperty(linkData, 'color', 'green') -
获取节点的线:
{string | null =} PID 端口ID findLinksConnected(PID) /* 实现 */ let node = myDiagram.findNodeForKey('key') node.findLinksConnected().each((link) => { console.info(link.data) }) -
获取进入节点的线:
{string | null =} PID 端口ID findLinksInto(PID) /* 实现 */ let node = myDiagram.findNodeForKey('key') node.findLinksInto().each((link) => { console.info(link.data) }) -
获取从节点出来的线:
{string | null =} PID 端口ID findLinksOutOf(PID) /* 实现 */ let node = myDiagram.findNodeForKey('key') node.findLinksOutOf().each((link) => { console.info(link.data) }) -
获取两个节点之间的线
{node } othernode B节点对象 {string | null =} PID 端口ID {string | null =} otherPID B节点端口ID findLinksTo(othernode, PID, otherPID) /* 实现 */ let node0 = myDiagram.findNodeForKey('key0') let node1 = myDiagram.findNodeForKey('key1') node0.findLinksTo(nodeB).each((link) => { console.info(link.data) })
树节点
-
找节点的所有父祖节点,包括该节点
node.findTreeParentChain() /* 实现 */ node.findTreeParentChain().each((pNode) => { console.info(pNode.data) }) -
找节点的所有子孙节点,包括该节点
node.findTreeParts() /* 实现 */ node.findTreeParts().each((sNode) => { console.info(sNode.data) }) -
找节点的父
node.findTreeParentNode() /* 实现 */ let parentNode = node.findTreeParentNode() -
找节点的子
node.findTreeChildrenNodes() /* 实现 */ node.findTreeChildrenNodes().each((childNode) => { console.info(childNode.data) })
画布常用增删改查API
-
添加画布元素
// 添加节点 addNodeData(NodeData) // 添加连线 addLinkData(LinkData) /* 实现 */ // 添加节点 let node = { key: id, id: id, color: "#fff", name: name, color2: "#000", text: type, loc:location, /* bold、italic、fontsize、fontFamily、font 是我设置的存储字体属性 */ bold: "normal", italic: "normal", fontsize: 12, fontFamily: "Segoe UI,sans-serif", font: { bold: "normal", italic: "normal", fontSize: 12, fontFamily: "Segoe UI,sans-serif", }, }; this.diagram.model.addNodeData(node); // 添加连线 let link = { from: from, to: to, text: "text", id:id, key:key }; this.diagram.model.addLinkData(link); -
删除画布元素
// 删除节点 removeNodeData(nodeData) // 删除连线 removeLinkData(linkData) /* 实现 */ // 通过节点的 key 拿到节点对象并删除 let node = this.diagram.model.findNodeDataForKey(this.nodeFrom.key); this.diagram.model.removeNodeData(node); // 通过事件获取到要删除的连线 id,查找并删除 this.association.forEach((item) => { /* this.association 是我当前画布的所有连线对象 */ if (item.id === this.checkId) { /* 查找要删除的连线 */ this.diagram.model.removeLinkData(item); } }); // 也可以通过获取画布选中对象进行删除, 初始化 GoJS的时候绑定选中项监听 // 监听选中项 let that = this this.diagram.addDiagramListener("ChangedSelection", function (e, i) { console.log("重新选择了", e); that.selectNode = []; that.selectLink = []; that.diagram.selection.each(function (part) { if (part instanceof go.Node) { that.selectNode.push(part.data); /* 获取当前选中节点 */ } else if (part instanceof go.Link) { that.selectLink.push(part.data); /* 获取当前选中连线 */ } }); }) // 然后可以对选中执行要执行的操作 -
更新画布元素
setDataProperty(data,propName,val) // 参数: // data:NodeData或LinkData对象 // propName:要更新的属性名 // val:要更新的属性值 /* 实现 */ // 拿到节点 const nodeData = myDiagram.model.findNodeDataForKey('key') // 对元素对象的属性更改的时候,如果没有该属性则添加这个属性 myDiagram.model.setDataProperty(nodeData, 'text', '2333') -
查询画布元素
// 通过 key 获取节点 findNodeDataForKey('key') // 通过 linkData 模糊查询匹配线集合 findLinksByExample(linkData) /* 实现 */ const nodeData = myDiagram.model.findNodeDataForKey('key') // 根据 linkData,模糊匹配线集合,linkData 可以为线的部分属性 let linkData = { from:'1', to:2 } const links = myDiagram.model.findLinksByExample(linkData) // 遍历输出所有线的数据对象 while(links.next()){ console.info(links.value.data) }