我使用d3.js創建大量的svg:橢圓元素(〜5000)。在初始渲染後,一些數據項可以通過後端進行更新(我會知道哪些數據),並且我想改變這些橢圓的顏色(例如)。D3.js - 檢索指定數據子集的DOM子集
是否有一種快速方法來恢復與數據項或項目相關的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提供了一個DOM - > data通過domElement的映射。 __data__
。有沒有一種快速簡單的方法來計算反向映射,而不是手動緩存這些值?
我需要從數據獲取 - > DOM。
這不是一種通用的方法來解決它,但在你的情況下,如果你已經知道哪些元素會改變,哪些不會,你可以把它們放在'g.will-change'和'g.will-not- change'。然後選擇它們會很容易而且便宜。但是,如果每次改變的子集都不同,可以從幾種不同的方法中選擇一種,我可以在答案中解釋。 – 2013-02-16 07:06:10
不同的數據片斷正在不斷變化。標記DOM不會解決我的問題。我需要實際上能夠僅通過對數據項的引用來更新DOM。 – 2013-02-17 01:57:54