2012-08-27 12 views

Respuesta

2

Por lo tanto, este tampoco parece perfecto, pero siempre existe el método html().

​var d = [['a','b','c','d']]; 

var r = d3.select('#myTable').selectAll('tr') 
    .data(d); 

r.enter().append('tr').html(function(d) { 
    var i, s = ''; 
    for (i = 0; i < d.length; i += 1) { 
     s += (i%2===0) ? '<th>' : '<td>'; 
     s += d[i]; 
     s += (i%2===0) ? '</th>' : '</td>'; 
    } 
    return s; 
}​​​​​​​​​​​​​​​); 
+0

Dado que parece imposible lograr la unión de datos con diferentes tipos de elementos, de esta manera parece una buena forma de renunciar a d3 en las columnas, seguir usándolo para las filas y obtener el resultado necesario. Al usar 'each' en lugar de' html', incluso podría seguir usando d3 dentro de la solución. –

0

Lo mejor que puedo llegar a está haciendo una mirada <td> como un <th> mediante la aplicación de una clase basada en el índice de los datos:

var d = ['a','b','c','d','e','f','g']; 

var tr = d3.select("#myTableRow").selectAll("td") 
    .data(d).enter().append("td") 
    .text(function(d) { return d; }) 
    .classed("thLike", function(d,i) { return i%2===0; }); 

CSS:

.thLike { 
    font-weight: bold; 
} 
+0

Gracias, sí, eso puede ser una solución útil para muchos casos, pero también hay una diferencia semántica, y el caso de la 'tabla' fue un ejemplo.Sospecho que podría no haber ninguna solución. –

1

Por lo que yo puedo decir, tiene usted razón - no hay manera de hacer esto en el lenguaje D3 estándar. Presumiblemente, esto será posible una vez que selection.append() pueda tomar una función:

selección. anexar (nombre )

añade un nuevo elemento con el nombre especificado ... El nombre se debe especificar como una constante, aunque en el futuro podríamos permitir anexar de elementos existentes o una función para generar el nombre dinamicamente.

Afortunadamente tal función tomaría los argumentos estándar (data, index), y resolvería este problema. De lo contrario, en este momento, no hay forma de que pueda crear diferentes elementos a partir de una sola selección .enter() - .enter() solo admite .append, .insert y .select, ninguno de los cuales puede tomar un argumento de función.

Usted puede obtener algo de lo que quiere por munging los datos en tuplas y de doble añadiendo a la selección .enter(), como se muestra aquí: http://jsfiddle.net/xuJ6w/4/

// munge data 
var tuples = data.map(function(row) { 
    var newRow = [], 
     x; 
    // create array of objects 
    for (x=0; x<row.length; x+=2) { 
     newRow.push({ 
      label: row[x], 
      value: row[x+1]    
     }) 
    } 
    return newRow; 
}); 

var rows = d3.select('table').selectAll('tr') 
    .data(tuples); 

rows.enter().append('tr'); 

var cellPairs = rows.selectAll('.cell') 
    .data(function(d) { return d; }); 

var entry = cellPairs.enter(); 
entry.append('th') 
    .attr('class', 'cell') 
    .text(function(d) { 
     return d.label; 
    }); 
entry.insert('td', 'th + th') 
    .attr('class', 'cell') 
    .text(function(d) { 
     return d.value; 
    }); 

Pero como se puede ver, cuando la actualización se llama :

cellPairs 
    .style('background', '#CCC'); 

Solo se actualizan los últimos nodos añadidos, por lo que los datos no se han enlazado por completo.

0

https://github.com/mbostock/d3/wiki/Selections#wiki-data

selectores también pueden ser intersección (".this.that" para lógica AND) o unioned (".Este, .que" para lógica OR).

Por lo tanto, algo como esto podría funcionar para usted. No he probado, aunque (si esta selección no funciona, puede simplemente añadir la misma clase para cada una de las células TD/TH y seleccione que con TR .myClass):

var cells = tableRow.selectAll("TD, TH").data(data); 
cells.enter().each(d, i) { 
    var cell = d3.select(this); 
    cell.append(i%2 ? "TD" : "TH"); 
}) 
+0

Intenté esto, pero 'cada' en' enter' no funciona. - "la selección entrante solo define agregar, insertar y seleccionar operadores" –

+0

Me gustaría plantear un problema/mejora con D3. No veo otra forma de evitar esto además de las soluciones provistas por otras respuestas. – Glenn

Cuestiones relacionadas