我尝试在d3 v4中使用d3.legend.js,但遇到了问题。因此,我移植了index.html以使用d3 v4,以查看问题是在我的代码中还是在d3.legend.js中。参见my gist (running version) -问题在d3.legend.js Uncaught TypeError: Cannot read property '0' of undefined
的第47行。
我对d3 (或v3的更改)不是很熟悉,无法理解如何修复这个错误--有什么想法吗?
更新1:根据the release notes,这似乎与d3选择的更改方式有关。
但是仍然不确定如何从li选择中访问getBBox()方法。
更新2:如果li
为非空,则li.node().getBBox()
可以工作。出于某种原因,代码类似于
var li = g.selectAll(".legend-items")
.data(["g"])
.enter()
.append("g")
.attr("class", "legend-items")
如果类已经存在,则将li
保留为null。
我被迫使用(有点不雅)
var licreate = g.selectAll(".legend-items")
.data(["g"])
.enter()
.append("g")
.attr("class", "legend-items");
var li = g.selectAll(".legend-items");
发布于 2018-07-08 21:38:08
这个问题是在D3 v4的第一天发布的,它使用的是2012年的D3插件,远远早于v4 (实际上也早于v3 )。
这里有两个必要的改变:
D3 v4选择中的
[0][0]
是行不通的。它应该改用node()
:var lbbox = li.node().getBBox()
lb =为真) lb.enter().append("rect").classed("legend-box",(Lb);li = li.enter().append("g").classed("legend-items",为真).merge(Li);
此外,由于我看不到“更新”选项的更新情况,我建议您在此处使用简单的“回车”选择。
以下是更新后的bl.ocks:http://bl.ocks.org/GerardoFurtado/raw/ca06385c40afa5414830b3d3d449cbe5/efeeed6ffc42051f433cfcb54c462acfd0daebb5/
https://stackoverflow.com/questions/38774855
复制相似问题