我正在使用 d3 制作堆积条形图。
由于这个先前的问题,我正在使用 parentNode.__ data__.key 将与父节点关联的数据绑定到子节点。
数据是一个数组,每个条都有一个对象(例如“喜欢”)。然后每个对象包含一个值数组,这些值驱动每个条形的各个矩形:
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”。到目前为止,一切都很好。
问题是如何将相同的信息与点击事件相关联,建立在:
rect.on("click", function(d) {
return _this.onChartClick(d);
});
// or
rect.on("click", this.onChartClick.bind(this));
这是有问题的,因为 onChartClick 方法需要访问绑定数据 (d) 和图表执行上下文 ('this')。如果不是,我可以切换执行上下文并d3.select(this).attr("metric")
在 onChartClick 方法中调用。
我的另一个想法是将指标作为附加参数传递,但在这里使用 function(d, i, j) 的技巧似乎不起作用,因为它在单击事件发生之前不会运行。
你能提出一个解决方案吗?