【发布时间】:2015-07-17 02:13:43
【问题描述】:
我正在使用d3 collapsible layout 制作一棵可折叠的树。我希望树中的链接根据 json 数据具有不同的颜色。
json数据是
{"root":{
"name": "A",
"branchid" : 2,
"active" : true,
"activecount" : 3,
"children": [
{
"name": "Data1",
"branchid" : 2,
"active" : false,
"activecount" : 3,
"children": [
{
"name": "C",
"branchid" : 2,
"active" : true,
"activecount" : 3,
"children": [
{"name": "D","branchid" : 2, "active" : true,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : false,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : false,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : true,"activecount" : 3}
]
},
{
"name": "C",
"branchid" : 2,
"active" : true,
"activecount" : 3,
"children": [
{"name": "D","branchid" : 2, "active" : true,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : false,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : true,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : false,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : true,"activecount" : 3}
]
},
{
"name": "C",
"branchid" : 2,
"active" : false,
"activecount" : 3,
"children": [
{"name": "D","branchid" : 2, "active" : true,"activecount" : 3}
]
}
]
},
{
"name": "Data2",
"branchid" : 2,
"active" : true,
"activecount" : 3,
"children": [
{"name": "D","branchid" : 2, "active" : true,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : false,"activecount" : 3},
{
"name": "C",
"branchid" : 2,
"active" : false,
"activecount" : 3,
"children": [
{"name": "D","branchid" : 2, "active" : true,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : false,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : true,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : false,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : true,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : false,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : true,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : false,"activecount" : 3},
{"name": "D","branchid" : 2, "active" : true,"activecount" : 3}
]
},
{"name": "C","branchid" : 2, "active" : false,"activecount" : 3},
{"name": "C","branchid" : 2, "active" : false,"activecount" : 3},
{"name": "C","branchid" : 2, "active" : false,"activecount" : 3},
{"name": "C","branchid" : 2, "active" : true,"activecount" : 3},
{"name": "C","branchid" : 2, "active" : false,"activecount" : 3},
{"name": "C","branchid" : 2, "active" : true,"activecount" : 3},
{"name": "C","branchid" : 2, "active" : true,"activecount" : 3},
{"name": "C","branchid" : 2, "active" : false,"activecount" : 3},
{"name": "C","branchid" : 2, "active" : true,"activecount" : 3}
]
}
]
}}
如果目标节点的active 属性为真,我希望链接具有activebranch css 类,否则它应该具有link css 类。
.activebranch{
fill: none;
stroke: #000;
stroke-width: 3.5px;
cursor: pointer;
}
.link{
fill: none;
stroke: #bbb;
stroke-width: 3.5px;
cursor: pointer;
}
我正在使用以下代码来执行此操作,但它不起作用。
var link = svg.selectAll("path.link")
.data(links, function(d) {
if(d.target.active == "false")
return d.target.id;
});
var activelink = svg.selectAll("path.activebranch")
.data(links, function(d){
if(d.target.active == "true")
return d.target.id;
});
// Enter any new links at the parent's previous position.
link.enter().insert("path", "g")
.attr("class", "link")
.attr("d", function(d) {
var o = {x: source.x0, y: source.y0};
return diagonal({source: o, target: o});
})
.on("click", TimeLine);
activelink.enter().insert("path", "g")
.attr("class", "activebranch")
.attr("d", function(d) {
var o = {x: source.x0, y: source.y0};
return diagonal({source: o, target: o});
})
.on("click", TimeLine);
// Transition links to their new position.
link.transition()
.duration(duration)
.attr("d", diagonal);
activelink.transition()
.duration(duration)
.attr("d", diagonal);
// Transition exiting nodes to the parent's new position.
link.exit().transition()
.duration(duration)
.attr("d", function(d) {
var o = {x: source.x, y: source.y};
return diagonal({source: o, target: o});
})
.remove();
activelink.exit().transition()
.duration(duration)
.attr("d", function(d) {
var o = {x: source.x, y: source.y};
return diagonal({source: o, target: o});
})
.remove();
我使用 css 类 activelink 用于那些具有 "active" : true 和 css 类 link 的链接具有 "active" : false。
【问题讨论】:
-
为什么不使用
.attr('class', function(d) {return (d.active ? 'activelink' : 'link');}或在ES6 中添加所有链接:.attr('class', d => (d.active ? 'activelink' : 'link'))?如果我理解正确的话,我认为这应该可行...... -
如果我这样做,我还必须根据
d.active在selectAll函数(第一行)中选择类。var link = svg.selectAll(function(d){ return (d.target.active === "true" ? 'path.activebranch' : 'path.link');}) -
但这显示以下错误
Uncaught TypeError: Cannot read property 'active' of undefined -
或者你添加多个类,比如一个基本的
link类(你可以选择)和作为一个附加组件activeLink类。有一个小提琴或尝试一下可能会有所帮助:) -
我做了一个小提琴......但它不起作用......代码在这个链接中 - bl.ocks.org/mbostock/4339083
标签: javascript html css d3.js