2017-10-16 241 views
0

在图的第一负载我添加在我的模型三个要素:为什么在GoJS diagram.model.nodeDataArray的长度从diagram.findNodesByExample的结果不同({})

var model = new go.GraphLinksModel(); 
model.nodeKeyProperty = 'goKey'; 
model.nodeCategoryProperty = 'goType'; 
model.addNodeDataCollection([ 
    { 
     goKey: 'instance1', 
     goType: 'component', 
     //other data 
    }, { 
     goKey: 'instance2', 
     goType: 'tcp', 
     //other data 
    }, { 
     goKey: 'instance3', 
     goType: 'tcp', 
     //other data 
    }]); 
diagram.model = model; 
console.log(diagram.findNodesByExample({}).count); //3 
console.log(diagram.model.nodeDataArray.length); //3 

然后我除去两个项目与goType:“TCP”使用diagram.model.removeNodeData方法和模型中再次添加它们:

var item2 = _.find(diagram.model.nodeDataArray, {goKey: 'instance2'}); 
var item3 = _.find(diagram.model.nodeDataArray, {goKey: 'instance3'}); 
model.removeNodeData(item2); 
model.removeNodeData(item3); 
console.log(diagram.model.nodeDataArray.length); //1 
console.log(diagram.findNodesByExample({}).count); //1 

diagram.model.addNodeDataCollection([{ 
    goKey: 'instance2', 
    goType: 'tcp', 
    //other data 
    }, { 
    goKey: 'instance3', 
    goType: 'tcp', 
    //other data 
}]); 

但毕竟这在图不同节点的数量,我只看到两个在画布上的节点:

console.log(diagram.model.nodeDataArray.length); //3 
console.log(diagram.findNodesByExample({}).count); //2 

如果看一看diagram.findNodesByExample({}),使用方法每个,我看到INSTANCE2才被加入的结果:

diagram.findNodesByExample({}).each(function (item) { 
    console.log(item.data.goKey); 
}); 
// instance1 
// instance2 

我做错了什么?

回答

0

问题终于找到了。从模型中删除节点(我将它们保存在副本中)后,我再次添加它们,因此,如果查看这些节点,我们会看到一个额外的属性__gohashid,在再次将其添加到模型之前应该将其删除。我不知道它是如何工作的,但这串代码

delete node.__gohashid; 

修复了上述问题。希望它对某人有用。

1

我只是试过你的代码,但无法重现问题。以下是我使用的整个页面:

<!DOCTYPE html> 
<html> 
<head> 
<title>Minimal GoJS Sample</title> 
<!-- Copyright 1998-2017 by Northwoods Software Corporation. --> 
<meta charset="UTF-8"> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/gojs/1.7.28/go-debug.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script> 
<script id="code"> 
    function init() { 
    var $ = go.GraphObject.make; 

    diagram = 
     $(go.Diagram, "myDiagramDiv", 
     { 
      initialContentAlignment: go.Spot.Center, 
      layout: $(go.GridLayout) 
     }); 

    diagram.nodeTemplate = 
     $(go.Node, "Vertical", 
     $(go.TextBlock, new go.Binding("text", "goKey")), 
     $(go.TextBlock, new go.Binding("text", "goType")) 
    ); 

    var model = new go.GraphLinksModel(); 
    model.nodeKeyProperty = 'goKey'; 
    model.nodeCategoryProperty = 'goType'; 
    model.addNodeDataCollection([ 
     { 
     goKey: 'instance1', 
     goType: 'component', 
     //other data 
     }, { 
     goKey: 'instance2', 
     goType: 'tcp', 
     //other data 
     }, { 
     goKey: 'instance3', 
     goType: 'tcp', 
     //other data 
     }]); 
    diagram.model = model; 
    console.log(diagram.findNodesByExample({}).count); //3 
    console.log(diagram.model.nodeDataArray.length); //3 
    } 

    function replaceTwo() { 
    var model = diagram.model; 
    model.startTransaction(); 
    var item2 = _.find(model.nodeDataArray, { goKey: 'instance2' }); 
    var item3 = _.find(model.nodeDataArray, { goKey: 'instance3' }); 
    model.removeNodeData(item2); 
    model.removeNodeData(item3); 
    console.log(model.nodeDataArray.length); //1 
    console.log(diagram.findNodesByExample({}).count); //1 

    model.addNodeDataCollection([{ 
     goKey: 'instance2', 
     goType: 'tcp', 
     //other data 
    }, { 
     goKey: 'instance3', 
     goType: 'tcp', 
     //other data 
     }]); 
    model.commitTransaction("replace two"); 

    console.log(diagram.model.nodeDataArray.length); //3 
    console.log(diagram.findNodesByExample({}).count); //2??? -- No, I get 3 
    diagram.findNodesByExample({}).each(function(item) { 
     console.log(item.data.goKey); 
    }); 
    } 
</script> 
</head> 
<body onload="init()"> 
    <div id="myDiagramDiv" style="border: solid 1px black; width:100%; height:600px"></div> 
    <button onclick="replaceTwo()">Replace Two</button> 
</body> 
</html> 
+0

谢谢你的回答,但问题是重复使用已删除的节点。删除** __ gohashid **后,它已被修复。 – blackhard

相关问题