2012-10-20 8 views
21

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?

Odpowiedz

19

Znalazłem answer in this post

var circle = svg.selectAll("circle") 
    .data(data); 

circle.enter().append("circle") 
    .attr("r", 2.5); 

circle 
    .attr("cx", function(d) { return d.x; }) 
    .attr("cy", function(d) { return d.y; }); 

circle.exit().remove(); 

Odpowiedzią jest to, że muszę zadzwonić w ciekawy operatora na skutek selectAll.data a nie na skutek operatora dopisywania.

+1

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

+3

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

4

Istnieje przykład pod adresem http://bl.ocks.org/1095795, który pokazuje dodawanie i usuwanie węzłów z układu ukierunkowanego na siłę. Łącza i węzły muszą być obsługiwane osobno, a następnie należy ponownie uruchomić układ sił.

function restart() { 
    var link = vis.selectAll("line.link") 
     .data(links, function(d) { return d.source.id + "-" + d.target.id; }); 

    link.enter().insert("svg:line", "g.node") 
     .attr("class", "link"); 

    link.exit().remove(); 

    var node = vis.selectAll("g.node") 
     .data(nodes, function(d) { return d.id;}); 

    var nodeEnter = node.enter().append("svg:g") 
     .attr("class", "node") 
     .call(force.drag); 

    nodeEnter.append("svg:image") 
     .attr("class", "circle") 
     .attr("xlink:href", "https://d3nwyuy0nl342s.cloudfront.net/images/icons/public.png") 
     .attr("x", "-8px") 
     .attr("y", "-8px") 
     .attr("width", "16px") 
     .attr("height", "16px"); 

    nodeEnter.append("svg:text") 
     .attr("class", "nodetext") 
     .attr("dx", 12) 
     .attr("dy", ".35em") 
     .text(function(d) { return d.id }); 

    node.exit().remove(); 

    force.start(); 
} 
+1

To za mało. Dodaję i usuwam linki, a problem polega na tym, że nie jest on w porządku. Kiedy wybieram wyświetlanie linków typu A, tablica łączy to [A1, A2, A3], a następnie wybieram, aby zobaczyć łącza typu B, tablica to [A1, A2, A3, B1, B2], a następnie wybieram, aby nie widzieć typu Tablica to [B1, B2]. D3 następnie opuści 2 elementy i usunie 3, ale muszę zaktualizować te dwa elementy, ponieważ są one obecnie powiązane z A1 i A2 i potrzebuję, aby były powiązane z B1 i B2. Udaje mi się to zrobić, zapisując dane vis.selectAll ("g.Node"). (Węzły) i aktualizuję je. –

+0

Jeśli utworzysz plik jsfiddle, który pokazuje, co aktualnie robisz i na czym polega problem, możemy pomóc znaleźć lepsze rozwiązanie. – Bill

Powiązane problemy