为什么节点在" layoutstop"之后移动?事件已被提出?

时间:2015-02-27 23:49:50

标签: cytoscape.js

我希望在移动节点时启动新的弹性布局。为此,我在节点上收听“位置”事件,并在该节点上设置“移动”标志并关闭位置更改通知。然后当节点被释放时,我检查它是否已移动,如果是,我开始布局并设置变量以了解当前正在运行的布局。

以下是我使用的方法:

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);
);

为什么我需要超时?

1 个答案:

答案 0 :(得分:1)

我只能在Springy上重现这一点,就运行时和视觉效果来说,这是一个比所有其他包含的物理SIM布局更差的布局。

(1)我建议你不要使用Springy。它只是为了完整性而包括在内(有些人喜欢它,但我无法想象为什么)。

(2)https://github.com/cytoscape/cytoscape.js/issues/865