2012-04-12 20 views
8

Schnelle Frage zum Datenbeitritt. Angenommen, ich habe einige Elemente, die jeweils ein enthalten. Wenn ich die Daten anfänglich an die Daten anschließe, werden sie automatisch von den Elementen übernommen, die ich an die Eingabeauswahl angehängt habe.Vererbung in Daten Joins

Wenn die Daten geändert werden und ich es neu binden, erwartete ich, dass die Elemente die neuen Daten aufnehmen würden, aber das ist nicht passiert.

Um dies zu handhaben ich die Daten auf der unteren Ebene wie dies ausdrücklich rebind benötigt:

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

Diese Griffe sowohl die Schaffung Fall und die anschließende rebind. Aber es scheint irgendwie redundant zu sein, da das Zurückgeben von [d] im Wesentlichen automatisch mit der anfänglichen Vererbung von Daten von dem Elternelement geschieht.

Ist dieser Ansatz der richtige Weg, um damit umzugehen, oder bin ich irgendwo hier verwirrt?

Antwort

17

Wenn Sie Daten an Elemente über selection.data binden, werden die an diese Elemente gebundenen Daten aktualisiert. Es wird jedoch nicht automatisch die neuen Daten an abgeleitete Elemente propagieren; Sie müssen das selbst tun.

Wenn Sie selection.select aufrufen, das ist das Pendant zu selection.append, werden Daten vom übergeordneten Element an das ausgewählte untergeordnete Element für jedes ausgewählte Element gebunden. Wenn Sie selection.selectAll aufrufen, sind die Daten nicht gebunden. Daher müssen Sie anschließend selection.data aufrufen, um neue Daten an untergeordnete Elemente zu binden.

Es ist schwierig, Ihre Frage zu beantworten, ohne mehr Kontext zu sehen. Wenn Sie die Daten auf gElements aktualisiert haben, und jedes G-Element enthält einen Kreis, können Sie die Daten von den Eltern G auf das Kind Kreis mit selection.select propagieren:

gElements.select("circle"); 

das Code-Snippet Sie schrieb verwendet würde, nur dann, wenn Sie möchten einen neuen Kreis erstellen, wenn der Kreis fehlt. Dies ist in Thinking with Joins beschrieben. Der genaue Code, den Sie schreiben würden, hängt davon ab, ob er sowohl bei der Eingabe und Aktualisierung als auch bei der Aktualisierung ausgeführt wird.

+0

Ja, Sie haben Recht, ich habe nur 1 Kreis pro . Ich habe nicht bemerkt, dass die Auswahl die Datenvererbung verursacht hat, aber das sehe ich in der Dokumentation. Ich finde dies ein wenig kontraintuitiv, da ich immer daran gedacht habe, den Vorgang als schreibgeschützten Vorgang auszuwählen, aber dieser eine Fall bewirkt, dass der Knoten tatsächlich geändert wird. –