как узнать, выполнено ли размещение узлов силовой компоновкой?

У меня есть график, основанный на силовой раскладке. Я хотел бы наложить наложение «загрузка», пока график не завершит размещение узлов. Какое событие / свойство я могу использовать, чтобы узнать, что график построен?

Проверил API, ничего не нашел ..


person HotFrost    schedule 18.01.2013    source источник


Ответы (3)


Когда макет сходится, 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();
}
person Gene Golovchinsky    schedule 07.03.2013

Из документации, событие end отправляется, когда макет готов, т.е. когда force.alpha === 0.

Итак, вы можете узнать, когда это будет сделано, с помощью:

force
  .nodes(yourNodes)
  .links(yourLinks)
  .on('tick', function() {
    // layout is in progress
  })
  .on('end', function() {
    // layout is done
    callback();
  });
person user1027169    schedule 25.04.2014
comment
Это намного короче принятого решения! @TO может переключить прием? - person kwoxer; 28.06.2015

Это невозможно как встроенная функция, так как это зависит от того, что вы считаете выполненным при размещении узлов. Это делается путем вызова tick функции n раз, причем n в зависимости от размера имеющегося у вас графика и желаемой точности.

# force.tick (): запускает симуляцию силового макета за один шаг.

Я рекомендую вам прочитать force.tick() документацию, если вы хотите узнать больше: https://github.com/mbostock/d3/wiki/Force-Layout#wiki-tick

person Christopher Chiche    schedule 20.01.2013