2013-01-18 10 views

risposta

6

Quando il layout converge, force.alpha() verrà impostato a 0. impostare un timer per il polling per questo (non troppo spesso!) e saprai quando hai finito.

Questo esempio deve ritentare ogni millesimo di secondo interval finché il layout non si interrompe. La variabile timer mantiene il timer corrente, che è possibile ripristinare se non si desidera attendere il completamento del layout.

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

non è possibile come un costruito in funzione di quanto dipende da ciò che si considera come sta facendo con i nodi immissione. Il modo in cui è fatto è chiamando la funzione tickn, con n a seconda della dimensione del grafico che hai e della precisione desiderata.

# force.tick(): esegue la simulazione del layout di forza di un passo.

vi incoraggio a leggere la documentazione force.tick() se volete saperne di più: https://github.com/mbostock/d3/wiki/Force-Layout#wiki-tick

13

Da the documentation, l'evento end viene inviato quando il layout è fatto, cioè quando force.alpha === 0.

Così si può scoprire quando è fatto con:

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

Questo è il modo più breve, allora la soluzione accettata! @TO può cambiare accetion? – kwoxer