Pracuję z D3.js. Mam przejścia pracuje ładnie, ale mam tylko jeden problem: jeśli drugie przejście rozpoczyna się przed pierwszym kończyD3.js: Przerwanie przejść jest przerywane?
To JSFiddle wykazując problemu: http://jsfiddle.net/kqxhj/11/
To działa dobrze przez większość czasu - CDG i LAX są dołączane i usuwane wraz ze zmianą danych - ale jeśli klikniesz przycisk dwa razy w krótkich odstępach czasu, zauważysz, że nowe elementy nie pojawiają się.
Jest to mięso z mojego kodu:
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);
});
Próbowałem dodać pewne oświadczenia debugowania, aby dowiedzieć się, co się dzieje, ale wszystko, co mogę zobaczyć, że kiedy to się stanie, wybór wyjście ma 4 elementy w, nie 3 - Nie rozumiem, dlaczego tak jest.
Czy istnieje sposób, czy w języku D3, czy w podstawowym kodzie JavaScript, że mogę zapewnić, że przejścia się nie nakładają?
Musisz posłuchać zdarzenia ['end'] (https://github.com/mbostock/d3/wiki/Transitions#wiki-each) i rozpocząć następne przejście dopiero po jego wystąpieniu. Alternatywnie, spójrz na ['transition.transition()'] (https://github.com/mbostock/d3/wiki/Transitions#wiki-transition). Oto [świetny artykuł] (http://bost.ocks.org/mike/transition/#life-cycle), który powinieneś sprawdzić. –
Usunięcie następuje również na końcu przejścia, więc nie trzeba tworzyć dwóch przejść wyjściowych tylko w celu usunięcia węzłów. Zapoznaj się z dokumentem [transition.remove] (https://github.com/mbostock/d3/wiki/Transitions#wiki-remove). – mbostock