2012-04-12 9 views
8

Domanda rapida sull'unione dei dati. Diciamo che ho alcuni elementi che contengono ciascuno a. Quando inizialmente aggiungo i dati al, viene automaticamente ereditato dagli elementi che accludo alla selezione di invio.Ereditarietà dei dati uniti

Quando i dati sono cambiati e lo riassembro a Mi aspettavo che gli elementi avrebbero raccolto i nuovi dati ma questo non è accaduto.

per gestire questo avevo bisogno di associare nuovamente in modo esplicito i dati al livello più basso in questo modo:

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

Questo gestisce sia il caso di creazione e la successiva rebind. Ma sembra ridondante in quanto il ritorno [d] è essenzialmente ciò che avviene automaticamente con l'ereditarietà iniziale dei dati dall'elemento genitore.

Questo approccio è il modo giusto per gestirlo oppure mi confondo da qualche parte qui?

risposta

17

Quando si associano dati a elementi tramite selection.data, vengono aggiornati i dati associati a tali elementi. Tuttavia, fa non propagare automaticamente i nuovi dati agli elementi discendenti; devi farlo tu stesso

Quando si chiama selection.select, che corrisponde a selection.append, i dati del genitore sono associati al figlio selezionato per ciascun elemento selezionato. Quando si chiama selection.selectAll, i dati non sono associati, quindi è necessario chiamare selection.data per associare nuovi dati ai bambini.

È difficile rispondere alla domanda senza vedere più contesto. Se avete aggiornato i dati sul gElements, e ogni elemento G contiene un cerchio, è possibile propagare i dati dal padre G al cerchio figlio utilizzando selection.select:

gElements.select("circle"); 

il frammento di codice che hai scritto dovrebbe essere utilizzato solo se vuoi creare un nuovo cerchio, se manca il cerchio. Questo è descritto in Thinking with Joins. Il codice esatto che scriveresti potrebbe dipendere dal fatto che verrà eseguito sia in entrata che in aggiornamento, o semplicemente in aggiornamento.

+0

Sì, hai ragione, ho solo 1 cerchio per . Non mi ero reso conto che selezionare causa l'ereditarietà dei dati ma vedo nella documentazione che effettivamente lo dice. Trovo questo un po 'contro-intuitivo come ho sempre pensato all'atto di selezionare come un'operazione di sola lettura, ma questo caso causa effettivamente la modifica del nodo. –