2013-01-18 9 views

Odpowiedz

6

Gdy układ zbieżny, force.alpha() zostanie ustawiona na 0. Ustaw timer do sondowania za to (nie zbyt często!) i będziesz wiedzieć, kiedy skończysz.

Ten przykład powinien być ponawiany co każde interval milisekund, dopóki układ się nie zatrzyma. Zmienna timer utrzymuje bieżący czasomierz, który można zresetować, jeśli nie chcesz już czekać na ukończenie układu.

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

To nie jest możliwe, ponieważ wbudowane funkcje, gdyż zależy od tego, co uznają za wykonane z wprowadzania węzłów. Sposób jest wykonywany przez wywołanie funkcji tickn razy, w zależności od rozmiaru wykresu i precyzji, którą chcesz.

# force.tick(): Uruchamia symulację układu sił w jednym kroku.

Zachęcam do zapoznania się z dokumentacją force.tick() jeśli chcesz wiedzieć więcej: https://github.com/mbostock/d3/wiki/Force-Layout#wiki-tick

13

Od the documentation, zdarzenie end jest wywoływane, gdy układ jest zrobione, to znaczy kiedy force.alpha === 0.

Więc można dowiedzieć się, kiedy to odbywa się:

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

To jest droga krótsza następnie przyjętego rozwiązania! @TO może zmienić akcepcję? – kwoxer