Creazione di un elemento "composto" è semplice come aggiungendo uno o più figli a un altro elemento. Nell'esempio, si desidera associare i dati a una selezione di elementi <a>
e assegnare a ciascun <a>
un singolo <circle>
figlio.
Prima di tutto, è necessario selezionare "a.node"
anziché "circle.node"
. Questo perché i collegamenti ipertestuali saranno gli elementi principali. Se non c'è un ovvio elemento genitore e vuoi semplicemente aggiungere più elementi per ogni dato, usa <g>
, l'elemento del gruppo SVG.
Quindi, si desidera aggiungere un elemento <a>
a ciascun nodo nella selezione di immissione. Questo crea i tuoi collegamenti ipertestuali. Dopo aver impostato gli attributi di ciascun collegamento ipertestuale, devi assegnargli un figlio <circle>
. Semplice: basta chiamare lo .append("circle")
.
var node = vis.selectAll("a.node")
.data(nodes);
// The entering selection: create the new <a> elements here.
// These elements are automatically part of the update selection in "node".
var nodeEnter = node.enter().append("a")
.attr("class", "node")
.attr("xlink:href", "http://whatever.com")
.call(force.drag);
// Appends a new <circle> element to each element in nodeEnter.
nodeEnter.append("circle")
.attr("r", 5)
.style("fill", function(d) { return fill(d.group); })
node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
Ricordate che D3 opera principalmente sul selezioni di nodi. Quindi chiamare .append()
nella voce di immissione significa che ciascun nodo nella selezione ottiene un nuovo figlio. Roba potente!
Un'ultima cosa: SVG ha its own <a>
element, che è quello a cui mi riferivo sopra. Questo è diverso da quello HTML! In genere, si utilizzano solo elementi SVG con SVG e HTML con HTML.
Grazie a @mbostock per aver suggerito di chiarire la denominazione delle variabili.
fonte
2012-02-11 11:34:22
Anche se capisco perché questo funzioni per la creazione, non si interrompe per l'aggiornamento? Poiché append() unisce le selezioni di inserimento e aggiornamento, non aggiungerà una nuova cerchia ai vecchi nodi ogni volta che viene chiamato l'aggiornamento? –
Ho aggiornato l'esempio per renderlo più chiaro. selection.append non * unisce * nessuna selezione, ma selection.enter(). append aggiunge automaticamente gli elementi alla selezione di aggiornamento. Il mio esempio originale aveva vis.selectAll (...) .data (...) .enter(). Append (...). Questo aggiunge solo elementi alla selezione in entrata, quindi nessun problema lì; il punto chiave è che inizialmente la selezione di inserimento contiene solo segnaposto per * nuovi * elementi che non esistono ancora. –