D3 2.4.2 を使用して、次のような多数のパス要素を作成します。
for (var i = 0; i < pathIndices.length; i++) {
graph.append("svg:path")
.style("stroke", colors[pathIndices[i]])
.style("stroke-width", "2.5px")
.style("fill", "none")
.attr("class", PATH_CLASS)
.attr("id", PATH_ID_PREFIX + pathIndices[i])
.attr("d", lineFunc(data))[0];
}
それらはすべて、期待どおりに画面に描画されます。後で、ユーザーが何らかの入力を行ったときに、そのうちの 1 つを前面に表示したいので、これを行うイベント ハンドラーを用意しました。
var pathToHighlight = selectPath(pathIndex);
var paths = d3.selectAll("." + PATH_CLASS);
paths.sort(
function(a, b) {
if (a === pathToHighlight) {
return -1;
}
else if (b === pathToHighlight) {
return 1;
}
else {
return 0;
}
}
);
Chrome でブレークポイントを設定すると、ここでのパスの選択が成功したことが示されます (paths
は SVGPathElements の配列です)。しかし、コードは何もせず、sort 関数内にブレークポイントを設定すると、常に未定義であることが示されa
ますb
。d3 コードに進むと、内部関数d3_selection_sortComparator
が適切な引数を使用してコンパレーターを呼び出すと、独自の未定義__data__
のメンバーと AND 結合されていることを除いて、次のundefined
ように渡されることがわかります。
// a and b are correct, but a.__data__ and b.__data__ are undefined
return comparator(a && a.__data__, b && b.__data__);
ここで何が間違っていますか?私のパスは画面に正しく描画されるため、正しいデータが必要なようです。右?
編集:画像: