2013-08-05 27 views
9

Witam Jestem całkiem nowy dla D3 i mam problemy z funkcją wyjściaWyjście nie działa poprawnie

Chcę zrobić listę i paski bez użycia SVG i wszystko działa jak urok.

Wybieram element div, a następnie dołączam i wprowadzam moje dane w celu wypełnienia zmiennych div.

var content = d3.select("#graph").selectAll("div") 
     .data(bandMates) 
     .enter() 
     .append("div") 
     .classed("member",true) //Div contenedor 

     content 
      .append("div") 
      .text(function(d) { return d.name; }); 

     content 
      .append("div") 
      .style("height", "40px") 
      .style("width", "0px") 
      .style("background-color", "#ff9999") 
      .transition() 
      .duration(1000) 
      .style("width", function (d){ return d.songs + "px";}); 

     content 
      .append("div") 
      .text(function(d) { return "wrote " + d.songs + " songs!"; }); 

na końcu procesu I zawiera funkcję content.exit().remove(); ponieważ chcę, aby móc zaktualizować liczbę utworów z innej funkcji, a następnie ponownie wywołując funkcję de draw().

konsoli Firebug rzuca mi ten błąd

content.exit is not a function 

Am I czegoś brakuje? Poszedłem do samouczków Bostocka i wszystko wydaje się być w porządku.

Zrobiłem JSFiddle sprawdzić mój kod:

http://jsfiddle.net/9HTUM/

Dzięki za czytanie!

Odpowiedz

9

Oto zaktualizowana skrzypce z trzech zmian: http://jsfiddle.net/URpfB/

1) początkowy selektor selectAll musi być bardziej konkretny, gdyż istnieje wiele potomek DIV na stronie po kod wykonywany raz. Musisz rozróżnić najwyższe elementy div i inne, wykonując jedną z następujących funkcji: 2) potrzebujesz funkcji klucza danych, aby d3 miał więcej możliwości niż długość/pozycja danych w celu określenia, kiedy nowe dane zostaną dodane lub stare dane są usuwane. W twoim przykładzie zachowałoby to każdy element div.member powiązany z pojedynczą nazwą elementu: data(bandMates, function(d){return d.name;})

3), jak zauważył Drzemka, musisz być bardziej precyzyjny przy przypisywaniu wyborów do zmiennych. Nie można wyjść() z menu wyboru().

+0

Love the Pete add =) Dziękuję bardzo za jsFiddle. To naprawdę poprawia odpowiedź Snoozer. enter() i exit() to wciąż kamień w moich butach w drodze do d3. –

13

pan zdefiniowane jako treść:

var content = d3.select("#graph").selectAll("div") 
    .data(bandMates) 
    .enter() 
    .append("div") 
    .classed("member",true) //Div contenedor 

Więc kiedy zrobić content.exit(), to jak próbuje zrobić d3.select("#graph").selectAll("div").data(bandMates).enter()..exit()

Dzwonisz zjazd na selekcji zostały już wprowadzone. Jeśli zamiast definiować zawartość jako:

var content = d3.select("#graph").selectAll("div") 
    .data(bandMates); 

a następnie zrobić content.enter().... w 3 linii kodu masz udostępnionego w swojej odpowiedzi, ten błąd powinien odejść.

Enter() i exit() są funkcjami wyboru danych, więc kiedy już nazywany enter() nie można później wywołać exit() i mają być znaczące. exit() musi być na tych samych danych.

+0

więc wejść i wyjść nie będzie działać na tej samej zmiennej w tym przykładzie, w szczególności czy co do zasady? –

+1

'enter()' i 'exit()' będą działać na tej samej zmiennej. To, co zrobiłeś w oryginalnym kodzie, było w zasadzie 'mydata.enter(). Exit()'. Nie możesz mieć obu po sobie. Potrzebujesz 'var x = d3.select (" stuff "). Data (mydata)', a następnie osobno wykonaj 'x.enter()' i 'x.exit()'. Powyższa odpowiedź Raya znacznie lepiej sugeruje dobre praktyki aktualizacji danych. –

+0

Och, widzę teraz. Dziękuję bardzo za odpowiedź. Pracuję nad moim kodem atm z tym problemem rozwiązanym :) –

1

Przyczyna tylko drzewa ...

Nie jest to związane z problemem PO, ale znalazłem to pytanie podczas badania, więc dodałem je do następnego przechodnia.

W moim przypadku oczyszczenie d3.layout.tree przy zwinięciu/rozwinięciu nie miało miejsca, ponieważ zapomniałem ustawić klasę "węzłów" na węzłach. Wydaje się, że drzewa d3 wymagają ustawienia atrybutu klasy węzłów.

nie działa

<g transform="translate(20,20)"> 
    <circle style="fill: rgb(198, 219, 239);" r="8"></circle> 
    <text style="fill-opacity: 1;" dx="15" dy="4" id="txt_SELF_SERVICE" class="text">Self Service</text> 
</g> 

pracował

<g transform="translate(20,20)" class="node "> 
    <circle style="fill: rgb(198, 219, 239);" r="8"></circle> 
    <text style="fill-opacity: 1;" dx="15" dy="4" id="txt_SELF_SERVICE" class="text">Self Service</text> 
</g> 
Powiązane problemy