我一直在尝试创造一个部队布局。一切都很好,除了一件事。添加的节点,即使正在删除数据,也不会被移除。
我只附加对应于这个问题的代码,因为整个代码太大了:
函数开始(初始){
link = link.data(force.links(), function(d) { return d.source.id + "-" + d.target.id; });
link.enter().insert("line", ".node").attr("class", "link");
node = node.data(force.nodes());
nodes = node
.enter()
.append("div")
.attr("class", function(d) {
var className = "";
if(d.className=="event-sub-label")
className += "node color-class-" + (((colorScale(d.category)+1)%5)+1);
else
className += "node color-class-" + colorScale(d.category);
if (d.className=="event-sub-label") { className += " pop-3"; //+ popScore(d.activity_score)
}
else { className += " " + d.className; }
if (!initial) { className += " new-node new-indicator"; }
return className;
})
.attr("id", function(d) { return d.id; });
if (initial) {
nodes = nodes
.style("transform", "scale(0)")
.style("-webkit-transform", "scale(0)")
} else {
nodes = nodes
.style("transform", "scale(.01)")
.style("-webkit-transform", "scale(.01)")
}
var events = {};
var cancelEvent = function (d) {
if (!events[d.id])
return;
clearTimeout(events[d.id]);
return true;
};
nodes = nodes
.on("mouseover", function (d) {
var self = this;
cancelEvent(d);
events[d.id] = setTimeout(function () { events[d.id] = null; mouseoverNode.call(self, d); }, 100);
})
.on("mouseout", function (d) {
if (cancelEvent(d) || d.dragging)
return;
mouseoutNode.call(this, d);
})
.call(nodeDrag);
nodes.filter(function(d) { return d.image_url; })
.append("div")
.attr("class", "article-image")
.attr("style", function (d) {
return "background-image: url(" + d.image_url + ")";
})
var ellipses = nodes.append("div").attr("class", "ellipse");
ellipses.append("h2")
.html(function(d) {
return d.title_truncated;
})
.attr("class", "title-preview");
node.exit().remove(); //The old nodes should be removed here
link.exit().remove();updateNode(){ //添加新节点
$.each(eventDict, function (c) {
if(catEventFlag[eventDict[c].node.category].flag==2)
collapse(this,eventDict[c].node);
});
function addNodes(category)
{
_.each(subEvents[category], function (c) {
dataset.push(c.node);
});
$.each(dataset, function (i, c) {
if(c.className== "event-sub-label")
processInternalNode(c);
});
d.thisClicked = true;
d.fixed = true;
runUpdate = false;
start(true);
force
.charge(chargeAlt)
.alpha(.01)
.start();
}
var category=d.category;
d.thisClicked = true;
if(catEventFlag[category].flag==0)
{
catEventFlag[category].flag=2;
var fileName = category +'.json';
d3.json(fileName, function(blah) {
root = blah;
$.each(root, function (i, dd) {
var c=dd.event;
subEvents[category][i] = {
node: {
//Node Data
},
x: xCoords[i],
y: yCoords[i]
};
});
addNodes(category);
});
}
else if(catEventFlag[category].flag==1)
addNodes(category);和崩溃(){//表示崩溃节点。
var category = d.category;
catEventFlag[category].flag=1;
d.thisClicked = false;
console.log(links);
function executeSplicing(){
var i = links.length-1;
while (i >=0 ) {
console.log(i+" "+links[i].source.id);
if (links[i].source.className == "event-sub-label")
{
//console.log("link?");
links.splice(i,i+1);
}
i--;
}
nodes[0].splice(node[0].length-5); //Nodes and links Spliced already
console.log(force.nodes()); //force.nodes() still has the old data
return true;
}
start(executeSplicing());
force.stop()
.charge(charge)
.alpha(.05)
.start();}
如果代码太混乱,请告诉我。我将尝试删除更多的部分,使它更简单。当前的问题是"updateNodes“函数正确地添加了节点,而力布局也得到了新的节点。但是在折叠函数中,节点是从“节点”var中拼接的,但是数据没有从force.nodes()中删除;
提前谢谢你
发布于 2014-07-19 18:03:04
只是为了确保其他人面临类似的问题,直接得到答案!
在这里,在代码中,连接到节点的数据位于var "dataset“中。因此,仅在更新"dataset“中的数据时,.exit().remove()就会像建议的Lars Kotthoff那样工作。仅仅更新“节点”是不够的,就像我在这个问题中所做的那样。希望这对其他D3.JS初学者有所帮助。
https://stackoverflow.com/questions/24830830
复制相似问题