【问题标题】:how find out if force layout done placing the nodes?如何确定强制布局是否完成放置节点?
【发布时间】:2013-01-18 20:26:49
【问题描述】:

我有基于力布局的图表。我想放置一个“加载”覆盖,直到图表完成放置节点。我可以使用什么事件/属性来确定该图表已完成?

我检查了API,找不到任何东西..

【问题讨论】:

    标签: d3.js force-layout


    【解决方案1】:

    the documentationend 事件在布局完成时调度,即在force.alpha === 0 时。

    这样你就可以知道什么时候完成了:

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

    【讨论】:

    • 这比公认的解决方案要短得多! @TO 可能会切换接受?
    【解决方案2】:

    当布局收敛时,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();
    }
    

    【讨论】:

      【解决方案3】:

      这不可能作为内置功能,因为它取决于您认为放置节点的操作。完成的方法是调用tick 函数n 次,n 取决于您拥有的图形的大小和您想要的精度。

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

      如果您想了解更多信息,我鼓励您阅读 force.tick() 文档:https://github.com/mbostock/d3/wiki/Force-Layout#wiki-tick

      【讨论】:

        猜你喜欢
        • 2018-02-01
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 2014-01-10
        相关资源
        最近更新 更多