我正在使用d3制作堆叠条形图。d3.js:将数据从父节点传递给子节点onclick事件
感谢this previous question我使用parentNode .__ data __。key将与父节点关联的数据绑定到子节点。
数据是一个数组,每个数据条有一个对象(例如'likes')。然后,每个对象包含驱动每列中的各个矩形值的数组:
data = [{
key = 'likes', values = [
{key = 'blue-frog', value = 1},
{key = 'goodbye', value = 2}
]
}, {
key = 'dislikes, values = [
{key = 'blue-frog', value = 3},
{key = 'goodbye', value = 4}
]
}]
图表工作正常,并且所以在父度量数据结合到子SVG属性:
// Create canvas
bars = svg.append("g");
// Create individual bars, and append data
// 'likes' are bound to first bar, 'dislikes' to second
bar = bars.selectAll(".bar")
.data(data)
.enter()
.append("g");
// Create rectangles per bar, and append data
// 'blue-frog' is bound to first rectangle, etc.
rect = bar.selectAll("rect")
.data(function(d) { return d.values;})
.enter()
.append("rect");
// Append parent node information (e.g. 'likes') to each rectangle
// per the SO question referenced above
rect.attr("metric", function(d, i, j) {
return rect[j].parentNode.__data__.key;
});
然后这允许创建每个矩形的工具提示,其中说“喜欢:2”。到现在为止还挺好。
的问题是如何与一个click事件相同的信息相关联,建立在:
rect.on("click", function(d) {
return _this.onChartClick(d);
});
// or
rect.on("click", this.onChartClick.bind(this));
这是有问题的,因为onChartClick方法需要访问数据绑定(d)和图表执行上下文(”这个')。如果没有,我可以切换执行上下文并在onChartClick方法中调用d3.select(this).attr("metric")
。
我的另一个想法是将度量作为附加参数传递,但这里使用函数(d,i,j)的技巧似乎并不奏效,因为直到发生单击事件时才运行该函数。
你能提出一个解决方案吗?
谢谢。这非常有帮助。恐怕我仍然陷在如何引用onChartClick函数的中间。它存在于整个图表/类的上下文中,而不是矩形。 –
查看更新的答案给你一些想法。 – nautat
我只是看着它。真正的大师级!这需要花一点时间才能完成,并确保我理解。我想知道,你认为这个问题的标题应该是什么? –