2013-01-06 15 views
9

Sto giocando con lo drag multiples example e ho notato qualcosa che non so spiegare.Perché d3's select() e selectAll() si comportano diversamente qui?

In questo frammento:

var svg = d3.select("body").selectAll("svg") 
    .data(d3.range(16).map(function() { return {x: width/2, y: height/2}; })) 
    .enter().append("svg") 
    .attr("width", width) 
    .attr("height", height); 

ho cambiato selectAll-select. Funziona ancora, ma ora gli elementi svg vengono aggiunti dopo il il tag </body>. Il codice originale, con selectAll, li aggiunge dopo il tag <body> come ci si aspetterebbe.

Poiché l'html originale contiene alcuna hardcoded <svg> elemento, penserei che sia select e selectAll solo restituisce la selezione vuota. Quindi non riesco a capire perché hanno un comportamento diverso.

Sto solo cercando una spiegazione. Grazie! Il post di

+0

Beh, non ha senso per selezionare * una * elemento se si vuole realmente a che fare con quelli multipli. Quindi penso che l'uso di '.select' +' .data' non dovrebbe essere comunque un caso d'uso valido. '.select' sembra creare una selezione con' parentNode' essendo '' (il nodo radice HTML) e '.selectAll' una selezione con' '(dopo' .select ('body') '). Aggiungere gli elementi a 'html' non sembra essere il comportamento previsto, ma potrebbe essere intenzionale. Chiederei all'autore, potrebbe anche essere un bug. –

+0

re: il tuo punto sulla validità del caso d'uso di select, la mia comprensione è stata che sia select che selectAll restituiscono un oggetto selection, che è una sorta di collezione. succede solo che la collezione restituita da select abbia un singolo elemento (o sia vuota). quindi l'applicazione di data() è valida in entrambi i casi. per favore correggimi se quella comprensione è sbagliata – Jonah

+0

. selezionare dovrebbe solo afferrare il primo elemento che corrisponde all'identificatore, non dovrebbe accodare diversamente da selectAll. Lo posterei come un bug su Github. – Elijah

risposta

3

check Mike Bostock in merito a Select/selectAll: Nested Selections

Per citare:

C'è una differenza importante tra selezionare e selectAll: selezionate conserva il raggruppamento esistente, mentre selectAll crea un nuovo raggruppamento. Calling select conserva quindi i dati, l'indice e persino il nodo genitore della selezione originale!

7

La differenza fondamentale tra select e selectAll è che seleziona schiaccia la gerarchia delle selezioni esistenti, mentre selectAll lo conserva.

Pertanto, quando si utilizza una selectAll dopo l'altra, il risultato sarà molto simile a un elenco di cicli nidificati.

http://bost.ocks.org/mike/nest/

Problemi correlati