一些 cytoscape 布局是随机的,每次启动时位置都不是固定的。我从多个堆栈溢出问题中了解到,我们可以将布局数据(即包括其位置 x 和 y)保存到浏览器本地存储或会话存储中,以便我们可以使用相同的数据显示相同的布局。
但是,本地存储或会话存储的问题对于一个用户来说是件好事。但是,想象一下,如果有数千个用户使用同一个应用程序,服务器将为每个用户进行大量计算,以将各自的数据存储到各个浏览器。我们能否将数据以文件格式直接保存到应用程序/Web 服务器中,以便 1000 个用户将看到相同的布局,这也减少了不同数据集的计算。
谢谢你。想知道是否可以将数据转换为文件并存储在网络/应用服务器中。
是的,您可以存储位置数据。其实我心里有2个选择:
您可以将元素存储为 JSON:
JSON.stringify(cy.json().elements)
,然后保存此 JSON 字符串。
cy.json().elements
存储您的数据,如下所示:
您可以轻松恢复此数据,如
cy.json({elements: JSON.parse(jsonStr))
;
如您所见,
cy.json().elements
有点大。位置数据只是像 {x: 0, y: 0}
这样的小对象。除了 position
之外,它还包含许多其他数据。因此,如果您只需要恢复位置,您可以使用如下代码轻松手动存储它们。您可以使用 ele.id 和 node.position() 函数。
function storePositions() {
const nodes = cy.nodes();
const nodePositions = {};
for (let i = 0; i < nodes.length; i++) {
nodePositions[nodes[i].id()] = nodes[i].position();
}
return nodePositions;
}
您还可以轻松恢复节点位置。您可以使用 getElementById 和 node.position() 函数。
function restorePositions(nodePositions) {
const nodes = cy.nodes();
const nodePositions = {};
for (let k in nodePositions) {
const node = cy.getElementById(k);
if (node && node.length > 0) {
node.position(nodePositions[k]);
}
}
return nodePositions;
}