要約すると、ここでの問題は、レンダリングされたコードの svg マークアップ (ブラウザー開発ツールで表示) が、目的のマークアップ要素とデータのバインディングを実際に示していることです。ただし、そのバインディングはレンダリングされたビューには反映されません。
context :各セルがsvg rectとしてレンダリングされるグリッド(正方形セルの mxn マトリックス) を作成しました。データはオブジェクトの json 配列で、セルごとに 1 つのオブジェクトです。各オブジェクトは多数のプロパティで構成されています。これらのプロパティのいずれかの値は、各セルの面内に表示されるラベル (svg "text" 要素) としてレンダリングされます。
最初のレンダリングは問題なく、私がやりたいことを正確に行います。
並べ替え機能を呼び出すウィジェット (シンプルなボタン) を追加しました。
このボタンをクリックすると、マークアップを見ると、並べ替え自体が機能していることがわかります。つまり、並べ替えボタンをクリックすると、下のマークアップに示すように、ラベルが正しい並べ替え順序になっています。
<text id="labels" fill="white" x="140" y="222" text-anchor="middle">122.23</text>
<text id="labels" fill="white" x="304" y="304" text-anchor="middle">135.08</text>
<text id="labels" fill="white" x="304" y="222" text-anchor="middle">141.53</text>
<text id="labels" fill="white" x="222" y="140" text-anchor="middle">195.79</text>
<text id="labels" fill="white" x="222" y="222" text-anchor="middle">244.42</text>
<text id="labels" fill="white" x="222" y="304" text-anchor="middle">255.21</text>
<text id="labels" fill="white" x="304" y="140" text-anchor="middle">258.16</text>
ただし、この並べ替えはレンダリングされた ラベルには反映されません。
問題は、ここにある並べ替え関数 (sortByPropertyX) にある必要があります。
var sortOrder = false;
var sortByPropertyX = function() {
sortOrder = !sortOrder;
sortCells = function(x, y) {
if (sortOrder) {
return x.someProperty - y.someProperty;
}
return y.someProperty - x.someProperty;
};
svg.selectAll("rects")
.sort(sortCells)
.attr("x", function(d, i) {return d.x})
.attr("y", function(d, i) {return d.y})
svg.selectAll("text")
.sort(sortCells)
.text(function(d, i) {
return d.someProperty;
})
.attr("text-anchor", "middle")
.attr("x", function(d, i) {
return d.x + CELLWIDTH/2;
})
.attr("y", function(d, i) {
return d.y + CELLHEIGHT/2;
})