4
我在d3中遇到轉換問題。這個jsfiddle說明了這個問題:http://jsfiddle.net/3bzsE/圓弧半徑在d3轉換時未更新
當頁面加載時,使用dataset01爲數組中的每個人創建一個圓。 d.name被用作密鑰。
圖表下面的藍色矩形是更新點擊數據的按鈕。
這裏是更新功能可按:
function updateVis(data) {
var points = svg.selectAll('.nameinfo')
.data(data, function(d) { return d.name;});
var pointsEnter = points
.enter()
.append('g')
.attr('class', 'nameinfo');
pointsEnter
.append('circle')
.attr('cx', function(d) { return 10 + d.position * 100; })
.attr('cy', width/2)
.attr('r', 0)
.style('fill', function(d) { return z(d.position); })
.style('fill-opacity', 0.5)
.style('stroke', '#232323')
.append("title")
.text(function(d) { return d.name; });
pointsEnter
.append('text')
.attr('x', function(d) { return 10 + d.position * 100; })
.attr('y', width/2)
.attr("dy", "0.35em")
.style("text-anchor", "middle")
.style("font-size", "11px")
.text(function(d, i) { return d.name; });
pointsUpdate = points
.selectAll('circle')
.transition().duration(500)
.attr('r', function(d){ return d.value/2;});
var pointsExit = points.exit().transition().duration(500).remove();
pointsExit
.selectAll('circle')
.attr('r', 0);
}
的進入和退出的行爲符合市場預期,但圓半徑不改變對存在的進入和退出的數據集的名字。
使用值吉姆一個例子: 點擊按鈕三連扣一個活動:
- 喬,珍妮特和朱莉退出
- 簡和約翰進入
- 但是,吉姆的半徑(它應該縮小,因爲d.value從130變爲50)
點擊兩個帶有三個活動原因的Jim退出。點擊兩個中的三個,導致Jim從dataset03以正確的半徑輸入。
相同的行爲可以看到與其他名稱。在所有情況下進入和退出工作,但是如果兩個數據集具有相同名稱的元素,則在過渡時不會更新半徑
此編輯提供所需的行爲,但重新綁定數據與我對d3中更新模式的理解背道而馳。爲什麼僅更新轉換需要重新綁定?通過將點var更早地綁定到外部組元素,進入和退出轉換沒有問題訪問圓屬性。 – 2013-04-23 10:28:02
@AndrewStaroscik你是對的。更新了答案。感謝[此問題](http://stackoverflow.com/questions/9649958/d3-js-updating-visual)以獲取解決方案的更多線索。 – explunit 2013-04-23 13:20:06
我明白了,區別在於.select和.selectAll。謝謝! – 2013-04-23 14:08:34