Javascript Cytoscape.js可以';t使用cy.nodes().forEach获取初始位置

Javascript Cytoscape.js可以';t使用cy.nodes().forEach获取初始位置,javascript,cytoscape.js,Javascript,Cytoscape.js,我是Cytoscape.js的新手,到目前为止,我非常欣赏它的功能。我的问题如下:对于我的项目,我需要创建一个用户可以修改的图形,并且我需要有一个重置按钮,当用户首先发现所有元素时,该按钮将替换它们 我使用cose-bilkent布局,因为我获取数据时没有位置信息 这是我的js代码 var cy=cytoscape({ 容器:document.getElementById('cy'), 风格:[{ 选择器:'节点', 风格:{ 形状:“圆形矩形”, “背景色”:“红色”, 标签:'数据(id)

我是Cytoscape.js的新手,到目前为止,我非常欣赏它的功能。我的问题如下:对于我的项目,我需要创建一个用户可以修改的图形,并且我需要有一个重置按钮,当用户首先发现所有元素时,该按钮将替换它们

我使用cose-bilkent布局,因为我获取数据时没有位置信息

这是我的js代码

var cy=cytoscape({
容器:document.getElementById('cy'),
风格:[{
选择器:'节点',
风格:{
形状:“圆形矩形”,
“背景色”:“红色”,
标签:'数据(id)'
}
}, ],
});
cy.on('tap','node',功能(evt){
var节点=evt.target;
log(“点击”,node.id(),node.position());
});
赛义德([{
数据:{
id:'a'
}
},
{
数据:{
id:'b'
}
},
{
数据:{
id:'c'
}
},
{
数据:{
id:'ab',
资料来源:“a”,
目标:“b”
}
},
{
数据:{
id:‘ac’,
资料来源:“a”,
目标:“c”
}
}
]);
赛因布局({
名称:“cose bilkent”,
avoidOverlap:没错,
避免:10,
}).run();
cy.nodes().forEach(函数(ele){
log(“循环”,ele.id(),ele.position());

});我测试了您的函数,它似乎可以正常工作,循环返回每个节点的模型位置(绝对位置)。我唯一想到的是在实际加载节点之前调用函数:

var cy = cytoscape({
  ...
  style: [...],
});

cy.on('tap', 'node', function(evt) {
  var node = evt.target;
  console.log("tap", node.id(), node.position());
});

cy.add([...]);

                    // Wait for the eles to be added
cy.layout({...}).run();                // Call layout on eles

cy.ready(function () {                 // Wait for cytoscape to actually load and map eles
    cy.nodes().forEach(function(ele) { // Your function call inside
          console.log("loop", ele.id(), ele.position());
    });
});

在cytoscape的布局完全加载之前,所有节点都从位置(0,0)开始,然后更改位置(异步函数)。所以这可能就是为什么你的函数会这样做…

谢谢你的回答,那不起作用。然而,考虑到这个想法,我设置了一个超时,它解决了我的问题。有没有更好的方法来做到这一点呢?setTimeout(function(){cy.nodes().forEach(function(ele){console.log(“loop”,ele.id(),ele.position());});},2000);但是它应该是这样工作的,您的超时函数并不是真正的解决方案,您可以显示您当前的代码吗?正如我所说,唯一导致问题的是,在图形准备就绪之前调用了position()。您可以通过转到开发工具并在cy.ready()上设置断点来检查cy.ready()是否正常工作,如果在cy.layout().run()完成之前调用该函数,那么错误就来自于此,否则它应该可以工作。编辑:维德,我从来没有遇到过这种情况,但我很高兴它现在起作用了