2013-07-03 11 views

risposta

27

Il nome della classe specificato deve essere corretto, ovvero non è possibile avere qualcosa come function(d) { return d; }. Se è necessario che il nome della classe sia determinato dai dati, è necessario utilizzare .attr("class", ...).

Se si è preoccupati di sovrascrivere nomi di classi esistenti, si noti che è possibile recuperarli e aggiungerli come segue.

.attr("class", function(d) { return d3.select(this).attr("class") + " " + d; }) 
+0

Questo è esattamente quello che fa attualmente, sto fingendo i nomi delle classi. Mi stavo chiedendo se c'è un modo diretto per farlo. Grazie per la risposta. –

+7

Per la cronaca, ecco una richiesta di pull rilevante per implementare questo utilizzo utilizzando classi e il motivo per cui è stato rifiutato: https://github.com/mbostock/d3/pull/1072 – Sam

+0

Se si desidera eseguire questa operazione utilizzando una funzione di freccia per mantenere "questo" puntando a qualunque cosa sia fuori dalla funzione, puoi farlo come '.attr ('classe', (d, i, nodi) => d3.select (nodi [i]). attr ('classe') + '' + this.someMethod (d)) ' – user568458

4

ho incontrato un problema simile in cui ho voluto aggiungere una classe se una proprietà sul mio riferimento era vero e una classe diversa se la proprietà era falso:

selection.classed('class-one', function(d) { return d.property; }) 
    .classed('class-two', function(d) { return d.property; }); 

Se si dispone di un piccolo il numero di classi da aggiungere quindi qualcosa del genere potrebbe valere la pena di essere preso in considerazione.

0

Simile alla risposta suggerita, ma ho trovato

selection.each(function(d) { d3.select(this).classed(d.class, true) 

funziona anche.

1

La risposta di Lars è ottima, ma se si avvia senza alcuna classe sull'attributo, si aggiungerà la classe "null" all'elemento mentre l'attributo null viene forzato a una stringa. naturale passo successivo dal suo:

.attr("class", function(d) { 
     var existing = d3.select(this).attr("class") 
     if (existing == null){ 
     return d.column.class 
     }else{ 
     return existing + " " + d.column.class 
     } 
}) 

Questo potrebbe essere fatto in un one-liner con un operatore ternario, se lo vuoi più concisa

Problemi correlati