Sto lavorando con D3.js. Ho avuto transizioni lavorando bene, ma devo solo un problema: se una seconda transizione inizia prima della prima si finisce,D3.js: interrompere le transizioni interrotte?
questo è un JSFiddle dimostrando il problema: http://jsfiddle.net/kqxhj/11/
Funziona bene la maggior parte del tempo - CDG e LAX vengono aggiunti e rimossi man mano che i dati cambiano, ma se fai clic due volte in rapida successione sul pulsante, noterai che i nuovi elementi non compaiono.
Questa è la carne del mio codice:
function update(data) {
var g = vis.selectAll("g.airport").data(data, function(d) {
return d.name;
});
var gEnter = g.enter().append("g")
.attr("class", function(d) {
return "airport " + d.name;
});
// Perform various updates and transitions...
[...]
// Remove exited elements.
g.exit().transition()
.duration(1000)
.attr("transform", "translate(0," + 1.5*h + ")");
g.exit().transition().delay(1000)
.remove();
}
d3.select('#clickme').on("click", function() {
update(current_data);
});
ho cercato di aggiungere alcune istruzioni di debug per capire cosa sta succedendo, ma tutto quello che posso vedere è che quando succede, la selezione uscita ha 4 elementi in, non 3 - Non capisco perché sia così.
C'è un modo, sia in D3 o in JavaScript di base, che posso garantire che le transizioni non si sovrappongano?
È necessario ascoltare l'evento ['end'] (https://github.com/mbostock/d3/wiki/Transitions#wiki-each) e avviare la transizione successiva solo dopo che si è verificata. In alternativa, guarda in ['transition.transition()'] (https://github.com/mbostock/d3/wiki/Transitions#wiki-transition). Ecco un [ottimo articolo] (http://bost.ocks.org/mike/transition/#life-cycle) che dovresti controllare. –
Inoltre, la rimozione avviene alla fine della transizione, quindi non è necessario creare due transizioni di uscita solo per rimuovere i nodi. Vedi la [documentazione di transition.remove] (https://github.com/mbostock/d3/wiki/Transitions#wiki-remove). – mbostock