我正在使用 d3.js 创建大量 svg:ellipse 元素(~5000)。在初始渲染之后,一些数据项可以通过后端更新(我会知道哪些),我想改变那些椭圆的颜色(例如)。
有没有一种快速的方法来恢复与一个或多个数据项关联的 DOM 元素或元素?如果使用数据子集重新计算完整的 DOM 元素集的连接,除了显而易见的技术之外?
var myData = [{ id: 'item1'}, { id: 'item2' }, ... { id: 'item5000' }];
var create = d3.selectAll('ellipse).data(myData, function(d) { return d.id; });
create.enter().append('ellipse').each(function(d) {
// initialize ellipse
});
// later on
// this works, but it seems like it would have to iterate over all 5000 elements
var subset = myData.slice(1200, 1210); // just an example
var updateElements = d3.selectAll('ellipse').data(subset, function(d) { return d.id; });
updateElements.each(function(d) {
// this was O(5000) to do the join, I _think_
// change color or otherwise update
});
我每秒渲染更新多次(尽可能快,真的),而且更新少数元素的 O(5000) 似乎很多。
我在想这样的事情:
create.enter().append('ellipse').each(function(d) {
d.__dom = this;
// continue with initialization
});
// later on
// pull the dom nodes back out
var subset = myData.slice(1200, 1210).map(function(d) { return d.__dom; });
d3.selectAll(subset).each(function(d) {
// now it should be O(subset.length)
});
这行得通。但这似乎是一种常见的模式,所以我想知道是否有解决此问题的标准方法?我实际上想在多个渲染中使用我的数据,所以我需要更聪明,这样它们就不会相互绊倒。
基本上,我知道 d3 通过 domElement 提供来自 DOM -> 数据的映射。__data__
. 除了手动缓存值之外,是否有一种快速简便的方法来计算反向映射?
我需要从数据-> DOM 中获取。