我希望在移动节点时启动新的弹性布局。为此,我在节点上收听“位置”事件,并在该节点上设置“移动”标志并关闭位置更改通知。然后当节点被释放时,我检查它是否已移动,如果是,我开始布局并设置变量以了解当前正在运行的布局。
以下是我使用的方法:
var layouting = false;
var relayout = function() {
if (layouting === false) {
layouting = true;
cy.layout(forceFieldLayout);
}
}
var nodeMoving = function(e) {
cy.off('position', 'node', nodeMoving);
e.cyTarget.data("moving", true);
}
cy.on("free", 'node', function(e) {
if (e.cyTarget.data("moving") === true) {
e.cyTarget.data("moving", false)
relayout();
}
});
在layoutstop事件中,我重新开启了位置通知,但仍然提升了位置事件,从而再次启动了一个全新的布局,导致无限循环。
我在重新启用通知之前使用超时解决了问题。
cy.on("layoutstop", function() {
window.setTimeout( function(){
layouting = false;
cy.on('position', 'node', nodeMoving);
}, 250);
);
为什么我需要超时?
答案 0 :(得分:1)
我只能在Springy上重现这一点,就运行时和视觉效果来说,这是一个比所有其他包含的物理SIM布局更差的布局。
(1)我建议你不要使用Springy。它只是为了完整性而包括在内(有些人喜欢它,但我无法想象为什么)。