Por ejemplo, en un html <table>
, un <tr>
puede contener <th>
y <td>
. ¿Cómo vincularía los datos a una selección de fila que crearía columnas pares como <th>
e impar como <td>
?En d3 para javascript, ¿cómo se crean diferentes elementos para sus datos?
Respuesta
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;
});
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;
}
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. –
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.
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");
})
Intenté esto, pero 'cada' en' enter' no funciona. - "la selección entrante solo define agregar, insertar y seleccionar operadores" –
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
- 1. ¿Cómo se crean y actualizan sus scripts SQL?
- 2. jQuery Plugin Authoring - Establecer diferentes opciones para diferentes elementos
- 3. ¿Se crean AppDomains para cada solicitud?
- 4. ¿Cómo se crean dinámicamente los elementos de la vista Backbone?
- 5. Aparecen diferentes elementos en esta página para desplazarse a diferentes velocidades. ¿Cómo se hizo esto?
- 6. d3 + Backbone: actualizar elementos para los cuales los datos han cambiado
- 7. ¿Cómo se crean pruebas para "hacer cheque" con GNU autotools
- 8. ¿Cómo se crean proyectos Xcode híbridos para Mac y iPhone?
- 9. tamaño de letra ggplot para diferentes elementos
- 10. Resalte el nodo seleccionado, sus enlaces y sus elementos secundarios en un gráfico dirigido por fuerza D3
- 11. ¿Cómo se establecen diferentes límites de escala para diferentes facetas?
- 12. Uso de datos JSON en D3 Visualización de Javascript
- 13. ¿Cómo se crean argumentos opcionales en php?
- 14. ¿Cómo se crean botones con anchos iguales?
- 15. ¿Cómo se crean "Alias" en Apache Tomcat?
- 16. cómo crear etiquetas para los datos en el gráfico de donaciones utilizando d3.js
- 17. ¿Cómo se crean subtipos en Moose?
- 18. Uso de una matriz asociativa como datos para D3
- 19. Crear ViewHolders para ListViews con diferentes diseños de elementos
- 20. Javascript DateFormat para diferentes zonas horarias
- 21. Filtro discreto para D3 Filtro cruzado Dimensiones
- 22. En PHP, ¿cómo se crean objetos reutilizables ?, ¿existe una mejor práctica para esto? ¿Qué prefieres?
- 23. Comprender cómo D3.js vincula los datos a los nodos
- 24. Cuantos objetos se crean
- 25. ¿Cómo se crean instancias de Spring HandlerInterceptors?
- 26. Cómo actualizar un ListView para volver a consultar su cursor para volver a llenar sus datos y sus vistas
- 27. ¿Cómo se automatiza la minificación de Javascript para sus aplicaciones web Java?
- 28. DBCP - validationQuery para diferentes bases de datos
- 29. Funciones para diferentes constructores de datos
- 30. Impedir plantillas para descartar elementos DOM
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. –