2012-04-12 25 views
8

Szybkie pytanie o łączenie danych. Powiedzmy, że mam kilka elementów, z których każdy zawiera. Kiedy początkowo dołączam dane do, to są one automatycznie dziedziczone przez elementy, które dołączam do wyboru wejścia.Dziedziczenie danych łączy się z

Po zmianie danych i ponownym powiązaniu z nimi oczekiwałem, że elementy będą pobierać nowe dane, ale tak się nie stało.

Do tego musiałem wyraźnie ponownie powiązać dane na niższym poziomie jak ten uchwyt:

gElements.selectAll("circle") 
    .data(function(d) { return [d]; } 
    .enter().append("circle"); 

ten obsługuje zarówno sprawy tworzenie i późniejsze ponowne wiązanie. Ale wydaje się, że jest to zbyteczne, ponieważ zwracanie [d] jest zasadniczo tym, co dzieje się automatycznie z początkowym dziedziczeniem danych z elementu nadrzędnego.

Czy to podejście jest właściwym sposobem na poradzenie sobie z tym, czy gdzieś tu jestem zdezorientowany?

Odpowiedz

17

Po powiązaniu danych z elementami za pomocą selection.data aktualizuje dane powiązane z tymi elementami. Jednakże nie powoduje on automatycznej propagacji nowych danych do potomnych elementów; musisz to zrobić sam.

Po wywołaniu selection.select, która jest odpowiednikiem selection.append, dane z obiektu nadrzędnego są przypisywane do wybranego elementu potomnego dla każdego wybranego elementu. Podczas wywoływania selection.selectAll dane nie są powiązane, dlatego należy wywołać selection.data, aby powiązać nowe dane z dziećmi.

Trudno odpowiedzieć na pytanie, nie widząc więcej kontekstu. Jeśli zaktualizowane dane na gElements, a każdy element G zawiera jedno kółko, można propagować dane z macierzystego okręgu G do dziecka za pomocą selection.select:

gElements.select("circle"); 

Fragment kodu napisałeś będzie stosowany tylko wtedy, gdy chcesz utworzyć nowy krąg, jeśli brakuje koła. Jest to opisane w Thinking with Joins. Dokładny kod, który napiszesz, może zależeć od tego, czy zostanie wykonany zarówno po wprowadzeniu i aktualizacji, czy po prostu aktualizacji.

+0

Tak, masz rację, mam tylko 1 okrąg na . Nie zdawałem sobie sprawy, że wybranie spowodowało dziedziczenie danych, ale widzę w dokumentacji, że tak właśnie jest. Uważam, że jest to trochę sprzeczne z intuicją, ponieważ zawsze myślałem o akcie wyboru jako operacji tylko do odczytu, ale ten jeden przypadek rzeczywiście powoduje zmianę węzła. –

Powiązane problemy