2013-01-18 30 views

回答

6

当布局收敛,force.alpha()将被设置为0。设置一个计时器轮询为(不要过于频繁! ),你会知道你什么时候完成。

此示例应每隔interval毫秒重试,直到布局停止。变量timer保留当前计时器,如果您不想等待布局完成,可以重置该计时器。

var timer = null; 
function onCompletion(force, callback, interval) { 
    interval = interval || 300; 

    function retryIfRunning() { 
     if (force.alpha() != 0) 
      timer = setTimeout(checkAndRetry, interval); 
     else { 
      timer = null; 
      callback(); 
     } 
    } 

    retryIfRunning(); 
} 
2

这是不可能的,因为内置的功能,因为它取决于你考虑为与放置节点完成。完成的方式是调用tick函数n次,其中n取决于您拥有的图表大小和所需的精度。

#force.tick():运行力布局模拟一步。

我鼓励你,如果你想知道更多阅读force.tick()文档:https://github.com/mbostock/d3/wiki/Force-Layout#wiki-tick

13

the documentation,当布局完成时分派的end事件,即当force.alpha === 0

所以,你可以找出当它与完成:

force 
    .nodes(yourNodes) 
    .links(yourLinks) 
    .on('tick', function() { 
    // layout is in progress 
    }) 
    .on('end', function() { 
    // layout is done 
    callback(); 
    }); 
+1

这是方式更短,然后接受的解决方案! @TO也许切换接受? – kwoxer

相关问题