我正在使用 D3.js 根据从 Firefox 中的 AJAX 调用检索到的数据动态更新 HTML 表。在之前有数据之后,我的数组实际上可能为空(因此,首先使用 array = [ {...}, {...}, {...}, ... ] 调用此代码,然后用数组 = [] 调用,我使用 Firebug 验证变量数组实际上确实具有这些值)。当它第二次被调用时,我希望空数组会导致代码删除表中当前的所有行,但这不会发生。相反,旧数据仍显示在表中。有人可以解释为什么这段代码不正确(或者至少是做我想做的正确方法)?
var rows = d3.select(TABLE_BODY_ID)
.selectAll("tr")
.data(array, function(d) {
return d.id;
});
rows.enter()
.append("tr")
.selectAll("td")
.data(function() { ... })
.enter()
.append("td")
.each(function(d, i)
{
if(3 === i)
{
var img = d3.select(this)
.append("img");
img.attr("src", d)
.attr("width", 20)
.attr("height", 20);
}
else d3.select(this).text(function(d) { return d; });
});
rows.exit().remove();
我在其他表上使用与此基本相同的代码,并且它没有问题,所以我不知道为什么它不适用于这个表。
谢谢!
编辑以获取更多信息:
在又摸索了一些之后,我发现代码确实有效。行仍然出现在表中的原因显然是由于它后面的行:
$(TABLE_ID).trigger("sorton", [[[1, 1],[2, 1]]]);
显然,tablesorter 插件不能很好地与 D3.js 配合使用。我仍然不确定如何解决这个问题,但我有一些想法。