- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Cytoscape.js 的新手,到目前为止我真的很欣赏它的功能。我的问题如下:对于我的项目,我需要创建一个可以由用户修改的图表,并且我需要一个重置按钮来替换用户首先找到的所有元素。
我使用 cose-bilkent 布局,因为我获取没有位置信息的数据。
这是我的js代码。
var cy = cytoscape({
container: document.getElementById('cy'),
style: [{
selector: 'node',
style: {
shape: 'roundrectangle',
'background-color': 'red',
label: 'data(id )'
}
}, ],
});
cy.on('tap', 'node', function(evt) {
var node = evt.target;
console.log("tap", node.id(), node.position());
});
cy.add([{
data: {
id: 'a'
}
},
{
data: {
id: 'b'
}
},
{
data: {
id: 'c'
}
},
{
data: {
id: 'ab',
source: 'a',
target: 'b'
}
},
{
data: {
id: 'ac',
source: 'a',
target: 'c'
}
}
]);
cy.layout({
name: 'cose-bilkent',
avoidOverlap: true,
avoidOverlapPadding: 10,
}).run();
cy.nodes().forEach(function(ele) {
console.log("loop", ele.id(), ele.position());
});
当我点击一个节点后查看控制台时,我看到以下内容:
我的问题是:为什么当我点击节点时,对象位置是正确的 ({x: 30, y: 30}),而在循环中对象是 {x:0, y:0}?
编辑:在 Stephan 的回答后,我将代码更改为以下内容:
var cy = cytoscape({
container: document.getElementById('cy'),
style: [
{
selector: 'node',
style: {
shape: 'roundrectangle',
'background-color': 'red',
label: 'data(id )'
}
},
],
});
cy.on('tap', 'node', function(evt) {
var node = evt.target;
console.log("tap", node.id(), node.position());
});
cy.add([
{ data: { id: 'a' } },
{ data: { id: 'b' } },
{ data: { id: 'c' } },
{
data: {
id: 'ab',
source: 'a',
target: 'b'
}
},
{
data: {
id: 'ac',
source: 'a',
target: 'c'
}
}
]);
cy.layout({
name: 'cose-bilkent',
avoidOverlap: true,
avoidOverlapPadding: 10,
}).run();
setTimeout( function() {
cy.nodes().forEach(function(ele){
console.log("loop", ele.id(), ele.position());
});
}, 2000);
// Not Working :
// cy.ready( function() {
// cy.nodes().forEach(function(ele){
// console.log("loop", ele.id(), ele.position());
// });
// });
解决方案:
最后我找到了一个更好的解决方案:我使用事件“layoutstop”以便在正确的时刻开始位置的复制:
cy.on('layoutstop', function() {
cy.nodes().forEach(function(ele){
console.log("loop", ele.id(), ele.position().x, ele.position().y);
});
});
但是,如果您使用此解决方案,您必须知道它不适用于外部函数(出于某些未知原因)。因此以下将不起作用:
cy.on('layoutstop', copyPos());
function copyPos() {
cy.nodes().forEach(function(ele){
console.log("loop", ele.id(), ele.position().x, ele.position().y);
});
}
最佳答案
我测试了你的功能,它似乎对我来说工作正常,循环返回每个节点的模型位置(绝对位置)。我唯一想到的是在实际加载节点之前调用该函数:
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) 开始,然后更改(异步函数)。所以这可能就是为什么你的功能会这样做......
关于javascript - Cytoscape.js 无法使用 cy.nodes().forEach 获得初始位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50562657/
我在等待异步功能完成时苦苦挣扎。特别是,我发现这两种方法在测试继续之前等待异步函数完成,但不知道其中的区别(如果有区别的话):。我的目标是在实际测试开始之前等待bepreEach()块中的两个异步函数
我在等待异步功能完成时苦苦挣扎。特别是,我发现这两种方法在测试继续之前等待异步函数完成,但不知道其中的区别(如果有区别的话):。我的目标是在实际测试开始之前等待bepreEach()块中的两个异步函数
我在等待异步功能完成时苦苦挣扎。特别是,我发现这两种方法在测试继续之前等待异步函数完成,但不知道其中的区别(如果有区别的话):。我的目标是在实际测试开始之前,在beforeEach()块中等待两个Ja
我正在尝试在我的代码中尽可能多地使用 data-cy。 必须一直编写 cy.get('[data-cy=name]') 有点乏味。 是否可以创建一个默认情况下首先尝试查找数据的自定义命令。 所以如果我
我有一种情况,我想在拦截中生成 JWT token 并将其返回到它的主体中。 问题在于,在该 token 的有效载荷中,应该使用另一个拦截的值。 这意味着我只能在拦截期间生成 token 。 cons
findByText来自 Cypress 测试库 https://testing-library.com/docs/cypress-testing-library/intro 和 contains C
我们在本地测试的应用程序有一个运行在 上的前端和后端。本地主机:4200 和 127.0.0.1:8000 , 分别。 打电话时cy.visit('/somepage')我们希望它有一个不同的 bas
我有一个编辑器页面。当我添加任何内容并单击“保存”按钮时,我的 URL 将更改,在 URL 中添加一个随机 ID。我想在每次单击“保存按钮”时检查我的 ID 是否在更改。 我将 URL 结果保存在变量
我正在尝试在每次测试之前使用 Cypress 进行编程登录。我的 token 保存在 localStorage 中。如果我同步更改它,即简单地做 localStorage.setItem不涉及cy.r
Cypress.io 中的 cy.readFile 和 cy.fixture 有什么区别?我们应该在什么情况下使用 cy.readFile 和 cy.fixture ? cy.readFile('me
看起来它们是相同的。 cy.get("a").find("b") 和 cy.get("a b") 之间的输出有什么不同吗? (其中a和b是一些选择器,例如div和span,或者。 someClass
我想使用 cypress-audit 进行灯塔测试,但在完成他们在 https://www.npmjs.com/package/cypress-audit 上所说的一切之后它不起作用。我可以在 cyp
我试图在请求正文上断言以确保正确的新测试卡作为订单的一部分被传递。 it("User clicks confirm & pay button to complete order", () => {
我想在 CDialog 的 OnInitDialog 期间获取 cx 和 cy。 我可以用下面的代码做到这一点: myDialog::OnInitDialog() { CRect rcWindow
在使用 Cypress 一段时间后,我注意到 cy.wrap() 有一个奇怪的行为。虽然在钩子(Hook)之前将字符串包装在内部,但表示字符串在所有进一步测试中都可用,但对象仅在第一次测试中可用,而在
我需要一些关于如何处理以下情况的帮助。有一个模式,当关闭时发送 AJAX 请求,如果响应成功,则重绘 Datatables 表。我需要在触发 draw.dt 事件后测试表格的内容。 我获得了对表的引用
我正在尝试匹配网址的一部分 http://www.mywebsite.com/get-stuff在 cypress 中,并且无法弄清楚如何编写正则表达式匹配。 我试过: cy.contains('ht
在改用哈希路由器之前,我经常执行 cy.url 命令,以确保整个应用程序中的链接导航到正确的 URL 地址。现在我们使用哈希路由 cy.url 不再生成字符串,而是生成函数。有什么想法可以解决这个问题
我试图依次选择两个按钮,一个“删除”按钮,然后选择"is"弹出确认窗口,方法如下: cy.get('.btn-danger').last().click(); cy.get('.btn-primary
我已经在测试项目中安装了 ESlint,它开始显示我需要解决的一些错误 错误之一是在 cy.request('someURL'); 错误是 cy 未定义 所以我在这样的文件顶部添加了一个导入语句 im
我是一名优秀的程序员,十分优秀!