获取以前有界的数据

时间:2013-06-25 16:47:59

标签: svg d3.js

假设我使用的是example code from the selection.data() API docs的略微修改版本,

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; });

在我的矩阵2d数组的后续更新中,我想捕捉(并对......做一些事情)任何更改的表格单元格。例如

// 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元素之前将输出临时存储到变量,但是对于传递给匿名函数的先前绑定数据来说,它似乎很难(特别是对于这个2D数组示例)例如,selection.filter()

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

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

1 个答案:

答案 0 :(得分:1)

D3没有提供获取先前绑定数据的方法。在您的情况下,您可能需要考虑将数据值存储在绑定的元素的属性中,以便稍后进行比较,例如

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

然后你应该可以做类似

的事情
cells.filter(function(d) { return d3.select(this).attr("myvalue") != d; });