GoJS如何通过搜索、key值获取图表节点数据替代选中获取方式
GoJS节点获取替代方案实现说明
针对你需要替换选中节点获取逻辑的需求,以下是你提到的三个API的具体使用场景和实现逻辑:
findNodeDataForKey+findNodeForData组合方案(已知节点key场景)
适用场景:你已经从登录用户信息中拿到了用户对应的节点唯一key值,是查询效率最高的方案
实现逻辑:- 调用
myDiagram.model.findNodeDataForKey(目标key),直接从图模型中查询对应key的节点原始数据,无需遍历全量节点 - 调用
myDiagram.findNodeForData(上一步拿到的节点数据),即可获取到对应的可视化节点实例
代码示例:
// 假设已从登录态中获取用户绑定的节点key const userNodeKey = 'xxx' const nodeData = myDiagram.model.findNodeDataForKey(userNodeKey) if (nodeData) { const node = myDiagram.findNodeForData(nodeData) // 此处直接替换原有逻辑中selection.first()拿到的node即可 }- 调用
findNodesByExample方案(条件搜索场景)
适用场景:你不知道节点key,只知道节点的某个属性值(比如用户名、部门ID、角色标识等)需要匹配搜索
实现逻辑:
传入包含匹配规则的对象,方法会遍历全量节点,返回所有数据字段匹配规则的节点迭代器,支持多条件同时匹配
代码示例:// 比如搜索节点数据中loginAccount字段等于当前登录账号的节点 const matchedNodes = myDiagram.findNodesByExample({ loginAccount: currentUser.account // 可追加多个匹配条件,如deptId: currentUser.deptId }).toArray() if (matchedNodes.length > 0) { const node = matchedNodes[0] // 替换原有逻辑的node即可 }findNodeForData直接调用方案(已有节点数据场景)
适用场景:你已经从其他业务逻辑(比如接口返回、本地缓存)中拿到了节点的完整数据对象
实现逻辑:
直接传入已有的节点数据对象,方法会直接关联查找对应的可视化节点实例,不需要遍历查询,性能最优
代码示例:// 假设已从其他业务逻辑中拿到节点数据 const cachedNodeData = getUserRelatedNodeData() const node = myDiagram.findNodeForData(cachedNodeData) if (node) { // 替换原有逻辑的node即可 }
完整改造示例(基于key获取节点)
function showSubChartForLoginUser(userBindNodeKey) { var targetNodeData = myDiagram.model.findNodeDataForKey(userBindNodeKey); if (!targetNodeData) return; var node = myDiagram.findNodeForData(targetNodeData); if (node !== null) { myDiagram.scrollToRect(node.actualBounds); var model = new go.TreeModel(); var nearby = node.findTreeParts(); nearby.each(function(n) { if (n instanceof go.Node) model.addNodeData(n.data); }); myDiagram.model = model; var selectedLocal = myDiagram.findPartForKey(node.data.key); if (selectedLocal !== null) selectedLocal.isSelected = true; } }
内容的提问来源于stack exchange,提问作者SONG OH
相关产品推荐
相关产品推荐

