Estoy trabajando en sandro, y surgen cosas interesantes. Ahora empecé a hacer utilidades para d3. Lo más interesante es que hice un método que encapsula y da entidad al General Update Pattern de d3 e hice que los nodos updateados tengan que sí o sí ser hijos del nodo referenciado (en vez de cualquier descendiente), para evitar un montón de bugs que se dan eligiendo nodos.
Para usarlo en sandro es así:
define(["sandro/nadaMas/d3", function(d3h) {
// Acá hay código tuyo, que hace aSelection
aSelection.call( d3h.gupChildren, {
tag: "line", // nombre del tag de la entidad a insertar (obligatorio)
klass: "aClass", // nombre de la clase de las entidades insertadas (optional, sin clase si no está escrita)
values: [1,2,3,4], // datos para la visualización (función o array, igual que en d3)
key: function(d,i) {.....}, // key para los datos, opcional. Funciona igual que en d3
onEnter: function(s, defaultOnEnter) {....}, // acciones a tomar con la selección de los nodos nuevos. Opcional. Si no es seteada solo hace append de los nodos y les setea la clase si querés hacer eso y algo más defaultOnEnter(s) hace eso y devuelve la selección para seguir operando.
onUpdate: function(s, defaultOnUpdate) {.....}, // acciones a tomar sobre la selección de los nodos modificados (tanto agregados, como cambiados). Opcional.
onExit: function(s, defaultOnExit) {.....}, // acciones a tomar con la selección de los nodos que no matchean con los nuevos datos. Opcional.
Si no es seteada solo hace remove. Si
querés hacer eso y algo más defaultOnExit(s) hace eso y devuelve la
selección para seguir operando.
onUpdateOld: function(s, defaultOnUpdateOld) {.....} // Igual que onUpdate pero solo aplica a los nodos viejos
})
// Y acá más código
}
Si quieren, pueden usar el código as-is si usan requirejs, o adaptarlo un toque y usarlo en el browser como más les plazca. Pero, si quieren usarlo en el server también, la mejor forma que conozco es que usen sandro.
Espero que les guste!