He creado un diseño de fuerza con d3 y funciona bien. Mi inicial de datos se carga desde un archivo JSON y la carta se dibuja con técnicas que son similares a this d3.js example:Actualizar nodos existentes en un diseño de fuerza d3
Ahora que la tabla se encuentra en la pantalla tengo que añadir, actualizar y eliminar nodos en el volar desde los datos que recibo sobre un socket web. He agregado y eliminado métodos que funcionan, pero no puedo encontrar la forma correcta de actualizar las propiedades de un nodo existente.
De acuerdo con la lectura que he realizado, recojo que la técnica correcta es cambiar la fuente de datos, luego actualice la tabla usando el método enter().
Para actualizar un nodo que estoy haciendo lo siguiente:
function updateNode(id, word, size, trend, parent_id){
var updateNode = nodes.filter(function(d, i) { return d.id == id ? this : null; });
if(updateNode[0]){
updateNode.size = Number(size);
updateNode.trend = trend;
nodes[updateNode.index] = updateNode;
update();
}
}
La función de actualización actualiza entonces los nodos con:
function update(){
node = vis.selectAll('.node')
.data(nodes, function(d) {
return d.id;
})
createNewNodes(node.enter());
node.exit().remove();
force.start();
}
function createNewNodes(selection){
var slct = selection.append('g')
.attr('class', 'node')
.call(force.drag);
slct.append('circle')
.transition()
.duration(500)
.attr('r', function(d) {
if(d.size){
return Math.sqrt(sizeScale(d.size)*40);
}
})
}
estoy tomando el enfoque correcto para esto? Cuando pruebo este código, el nodo que obtengo como dato al intentar establecer el atributo de radio en el círculo es el último nodo en la matriz de nodos. Es decir. el que contiene los datos del nodo jerárquico en lugar de un objeto de nodo único.
Cualquier punteros sería muy apreciada, he pasado demasiado tiempo en esto :)
tengo el mismo problema, aunque en un contexto mucho más simple. ¿Encontraste una solución? –
podría poner su código en un editor en línea, por ejemplo http://phrogz.net/JS/d3-playground/#BlankDefault – ppoliani