d3を使用して積み上げ棒グラフを作成しています。
この前の質問のおかげで、parentNode .__data__。keyを使用して親ノードに関連付けられたデータを子ノードにバインドしています。
データは、バーごとに1つのオブジェクトを持つ配列です(たとえば、「いいね」)。次に、各オブジェクトには、バーごとに個々の長方形を駆動する値の配列が含まれています。
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メソッド内で呼び出すことができます。
私が持っていたもう1つのアイデアは、メトリックを追加のパラメーターとして渡すことでしたが、ここでfunction(d、i、j)を使用するトリックは、クリックイベントが発生するまで実行されないため、機能しないようです。
解決策を提案できますか?