3

假设我使用的是 selection.data() API 文档中示例代码的略微修改版本,

var matrix = [
   [11975,  5871, 8916, 2868],
   [ 1951, 10048, 2060, 6171],
   [ 8010, 16145, 8090, 8045],
   [ 1013,   990,  940, 6907]
];

var tr = d3.select("body").append("table").selectAll("tr")
    .data(matrix, function(d) { return d[0]; })
  .enter().append("tr");

var td = tr.selectAll("td")
   .data(function(d) { return d; })
 .enter().append("td")
   .text(function(d) { return d; });

在我的矩阵二维数组的后续更新中,我想捕捉(并用......做一些事情)任何变化的表格单元格。例如。

// updated matrix
var matrix2 = [
   [11975,  5871, 8916, 2868],
   [ 1951, 10048, 2060, 6171],
   [ 8010, 16145, 8090, 999999999],
   [ 1013,   990,  940, 6907]
];

// bind the new data
var tr = d3.select("table").selectAll("tr")
   .data(matrix2, function(d) { return d[0]; });

var cells = tr.selectAll("td")
   .data(function(d) { return d; });

var updatedCells = rows.filter(function(d,i) {
   // HOWTO get previously bound value for cell???
   var prevCellValue = null;
   return prevCellValue != d;
} );

在连接产生的更新选择中,有没有办法检索给定选择的先前绑定值?一旦我打电话selection.data(newData),似乎我已经丢失了以前绑定的数据。selection.data()在将新数据绑定到 DOM 元素之前,我可以调用并将输出临时存储到变量中,但是在传递给例如selection.filter().

(顺便说一句,我标记了“svg”,因为我的实际示例使用了 SVG 元素,所以我之前this.textContent在我的selection.filter()函数中尝试过。不幸的是,this.textContent已经有了给定单元格的新绑定数据值。)

编辑this.textContent“排序”具有先前绑定的数据,但它可能已被处理。如果可能的话,我更喜欢原始的、未更改的数据。

4

1 回答 1

1

D3 不提供取回先前绑定数据的方法。在您的情况下,您可能需要考虑将数据值存储在它所绑定的元素的属性中,以便稍后进行比较,即类似

.data(...)
.attr("myvalue", function(d) { return d; });

然后你应该能够做类似的事情

cells.filter(function(d) { return d3.select(this).attr("myvalue") != d; });
于 2013-06-25T19:56:24.380 回答