Używam jednego z przykładów układów sił (http://bl.ocks.org/1153292) do pokazania sieci na mojej stronie internetowej.Jak zaktualizować elementy układu sił D3, gdy zmieniają się dane podstawowe
Pozwalam użytkownikowi na wybór typu linków, które można zobaczyć w dowolnym momencie. Zauważyłem, że gdy wybieram link typu A, dodam typ łącza B, a następnie usuwam typ łącza A, pozostałe łącza typu B mają kolory A.
To jest kod, który uruchamia się, aby dodać linki do diagramu SVG. Zmieniam tablicę this.links
, dodając i usuwając z niej linki. Jak widać ustawić atrybut klasy, ale to nie jest aktualizacją - to pozostaje od rodzaju łącza A.
var path = svg.append("svg:g")
.selectAll("path")
.data(this.links)
.enter()
.append("svg:path")
.attr("class", function(d) { return "link " + d.type; })
.attr("marker-end", function(d) { return "url(#" + d.type + ")"; });
Obecnie obejść ten problem, aktualizując atrybut klasy wewnątrz funkcji kleszcza, ale to z kursu przyczynę dużo niepotrzebnej pracy.
Przeczytałem, że operacja enter zwraca połączony wybór elementów istniejących, a także nowych, aby operacja attr zaktualizowała istniejący i ustawiła nowy.
Czego mi brakuje?
Ido, wiem, że to jest stary post, ale uważam, że doświadczam tego samego problemu, który był i nadal nie rozumiem tego rozwiązania. Czy możesz wyjaśnić, jak to działa - jak rozwiązuje pierwotny problem? Dziękuję Ci. – Mars
Rozwiązanie działa, ponieważ aktualizacje atr cx i cy są poza kontekstem enter(), więc zdarzają się za każdym razem. W oryginalnym kodzie funkcje attr są wywoływane w kontekście enter(), więc są tworzone tylko raz zgodnie z tożsamością obiektu. Co to dla mnie znaczyło poznanie kluczowych funkcji jako drugiego argumentu dla danych(): http://bost.ocks.org/mike/constancy/ – velotron