を使用して、選択範囲をフィルタリングして、以下の深さでd3.layout.tree()
リンクするリンク線のみを含めようとしていますnodes
leafDepth
次の行は、私がそれをやろうとしている方法です:
links.enter().filter(function(d){return d.target.depth < leafDepth;})....
フィルターなしでグラフは正常に描画されますが、フィルターを追加すると、コンソールに次のエラーが表示されます。
Uncaught TypeError: Cannot read property 'depth' of undefined
d.target
の割り当てで、正常にアクセスしていることがわかりますlinkKey
。d.target
だから、後ですべての要素に存在することがわかっているものを確認しようとすると、なぜ undefinedなのかわかりませんd.target.depth
?? アイデンティティ関数を使用してデータを「ピックアップ」すると何が起こるかに関して、何かが欠けていますか??var link = links.selectAll("path.treeline").data( function(d){return d;} , linkKey);
繰り返しますが、行を追加するまで、これはすべて正常に機能します.filter(function(d){return d.target.depth < leafDepth;})
これが私のグラフ描画関数の主要部分です(それに続く一連のゲッター/セッターを除く)
Tree = function () {
var width = 1000, //default width
height = 1000, //default height
left = 0,
top = 0,
leafDepth = 5, // depth at which leaf nodes are at
leafClick = function (d){return console.log(d);},
linkKey, // key function for links
pathGenerator = d3.svg.diagonal().projection( function(d) {
return [d.x, height-d.y]; }),
childrenKey = function(d) {
return (!d.values || d.values.length === 0) ? null : d.values; },
linkKey = function(d) { return d.source.key+"_"+d.target.key; }
;
function chart(selection) {
selection.each(function (d) {
// setup layout
var tree = d3.layout.tree()
.size([width,height])
.children( function(d) {
return (!d.values || d.values.length === 0) ? null : d.values;
});
var nodeData = tree.nodes(d);
var linkData = tree.links(nodeData);
// 'this' is the selection
var links = d3.select(this).selectAll("g#links")
.data( [linkData] );
links.enter()
.append("g")
.attr("transform", "translate("+left+", "+top+")")
.attr("id","links");
var linkKey = function(d) { return d.source.key+"_"+d.target.key; }
var link = links.selectAll("path.treeline")
.data( function(d){return d;} , linkKey);
link.enter()
.filter(function(d){return d.target.depth < leafDepth;}) // PROBLEM HERE !!
.append("svg:path")
.attr("class", "treeline")
.attr("d", pathGenerator);
link.transition()
.attr("d", pathGenerator);
link.exit()
.remove();
});
return chart;
};
// a bunch of getter/setters for the vars defined at top
return chart; // this is using a version of the re-usable chart pattern by the way
}