Ich verwende den folgenden Code here, um Daten (im JSON-Format) mit Hilfe eines Baumes anzuzeigen, die ordnungsgemäß funktionieren. Das Ziel ist es, dass, wenn der Benutzer doppelt klickt auf einen Knoten, der die folgenden Dinge passieren sollte:Wählen Sie die Kinder eines Knotens aus einem Baum in d3.js
- (1) die Farbe des ‚ausgewählt‘ Knoten die Farbe aller
- (2) ändern ihre Kinder ändern (Unterbaum)
Das erste Ziel (1) funktioniert ordnungsgemäß. Um dies zu tun habe ich den Code-Schnipsel unter:
var node = svg.selectAll("g.node")
.data(nodes, function(d) { return d.id || (d.id = ++i); }, function(d) { return d.isSelected || (d.isSelected = false); });
Jeder Knoten verfügt über ein isSelected Attribut, das eine Art eines Kennzeichens ist. Und die Farbe des Knotens durch den nächsten Code-Schnipsel geändert:
var nodeEnter = node.enter().append("g")
.attr("class", "node")
//.attr("transform", function(d) { return "rotate(" + (d.x - 90) + ")translate(" + d.y + ")"; })
.on("click", click)
.each(function(d)
{
var sel = d3.select(this);
//var state = false;
sel.on("dblclick", function(e)
{
//window.alert("state is: " + state);
//state = !state;
if (!e.isSelected) {
e.isSelected = true;
d3.select(this).select("circle").style("fill", "black");
//Select all nodes
selectSubtree(e);
} else {
e.isSelected = false;
d3.select(this).select("circle").style("fill", "#fff");
//deselect all nodes
deselectSubtree(e);
}
});
});
Das Problem tritt auf, wenn der ‚ausgewählt‘ Knoten zum selectSubtree gesendet wird (d) Funktion. Ich weiß nicht, wie ich die Farbe des Knotens genau ändern soll. Kann mir jemand helfen?
function selectSubtree(node){
if(node.children){
node.children.forEach(function(d)
{
//Select all children
d.isSelected = true;
selectSubtree(d);
});}}
Mein erster Versuch war d3.select ("# id") zu verwenden, wählen Sie ("Kreis") Stil ("füllen", "#fff")..;, da jeder Knoten eine ID hat, aber nicht richtig funktioniert.
Es funktioniert! Vielen Dank. –