我正在使用vis.js / network开发一个简单的图形编辑器。由于编辑器必须存储网络状态,我有一个保存帮助器,我从网络中提取数据并将其存储为JSON。
目前,我使用看似相当丑陋/黑客的方式来提取存储数据:
// get nodes and edges
var nodes = network.body.data.nodes._data; // brief ones; network.body.nodes contain much more stuff (x,y, default stuff)
//# look for a suitable getter
var edges = network.body.data.edges._data;
// network.body.data.edges._data is a hash of { id: , from: , to: }
// get node positions
var positions = network.getPositions(),
nodeIds = Object.keys(nodes);
var storedEdges = [], storedNodes = [];
for(var edgeId in edges)
storedEdges.push({ from: edges[edgeId].from, to: edges[edgeId].to });
for(var nodeId in nodes) {
storedNodes.push({
id: nodes[nodeId].id, label: nodes[nodeId].label,
x: positions[nodeId].x, y: positions[nodeId].y
})
}
如您所见,我手动提取这些属性(id
,label
,x
,y
)并为每个节点设置为storedNodes
(或边缘)。我需要的是保存更改的属性 - 只保存那些非默认(自定义)属性。就像某些边缘的arrows
设置为"to"
一样,我想保存它(但不是arrows:false
用于其他边缘);或者如果一个节点有自定义的形状或颜色,我想保存它,而不保存每个节点的所有颜色,形状,字体大小等。
所以,我的问题是:如何获得节点的自定义属性?那有帮助吗?或者我是否必须迭代并比较几棵树(默认选项和实际选项)?有什么建议吗?
PS好吧,透过the whole list of methods告诉我,很可能没有这个任务的真正帮助者(除了可能是getOptionsFromConfigurator
,如果它没有配置器工作,但似乎它只告诉全局选项,不是那些节点或边缘)。所以我将检查getOptionsFromConfigurator
,然后继续搜索要迭代和比较的属性。 network.body.nodes[id].nodeOptions
和network.body.edges[id].edgeOptions
看起来很有希望。另一件需要注意的事情是使用vis.DataSet
(我应该尝试访问nodes
创建的new vis.DataSet(nodes)
并查看它们是否获得默认选项和自定义选项。