我很困惑爲什麼下面的簡單更新模式不起作用。據我所知,這遵循建議的General Update Pattern。一般更新模式不能按預期與d3.selection一起工作
<script src="https://d3js.org/d3-selection.v1.min.js"></script>
...
var dat = ["One","Two","Buckle my shoe"];
var sel = d3.selectAll("p.test").data(dat);
sel.enter().append("p").classed("test", true);
sel.exit().remove();
//update 1 ... doesn't work
sel.text(function(d) { return d;})
段落創建正常,但文本未設置。但是,如果我這樣做:
//update 2 ... this works as expected
d3.selectAll("p.test").text(function(d) { return d;});
...一切工作正常。第一個版本一直在過去。
更新:我嘗試使用全D3庫...
<script src="https://d3js.org/d3.v4.min.js"></script>
...和第一個版本再次工作。我需要比d3.selection更多嗎?爲了澄清,我過去的做法是定義一個單獨的更新函數,將選擇作爲參數。例如,function doUpdate(sel) { sel.text(...);}
這適用於我期望數據元素在大小中幾乎沒有變化的情況,但內容中的許多變化。將選擇存儲爲變量並反覆運行更新之前運行良好。
在d3.js版本4。進入(),並卸下襬臂這個工作好()是不夠的,你必須使用.merge()https://github.com/d3/d3-transition/blob/master/README.md#transition_merge這可能與你的update1不起作用有關。 ..如果你看看你提供的例子,它使用merge()。嘗試粘貼'.merge(text) .text(function(d){return d;});'在您的'.classed(「test」,true)之後'' – Tekill
雖然這可能需要使用d3轉換使用.enter(),.exit(),.remove()和.merge()...所以你可能想嘗試包括。 – Tekill
@Yourinium感謝您的意見。儘管我沒有使用轉換,並且我已經有了一個不需要添加額外腳本的解決方法。我查看了你發佈的鏈接,可以確認添加轉換,顏色,調度,簡化,內插和計時器腳本對問題沒有影響 - 這是值得的。 –