假设我使用的是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
“排序”具有先前绑定的数据,但可能会被处理。如果可能的话,我更喜欢原始的,未经改动的数据。
答案 0 :(得分:1)
D3没有提供获取先前绑定数据的方法。在您的情况下,您可能需要考虑将数据值存储在绑定的元素的属性中,以便稍后进行比较,例如
.data(...)
.attr("myvalue", function(d) { return d; });
然后你应该可以做类似
的事情cells.filter(function(d) { return d3.select(this).attr("myvalue") != d; });