2012-11-21 91 views
0

在此代碼,這http://enjalot.com/inlet/4124664/D3爲什麼我的數據沒有更新?

的主要部分是:

function render(data) { 

     var nodz = svg.selectAll(".node") 
      .data(data); 

     nodz.enter().append("g") 
      .attr("class", "node") 
      .attr("id", function(d) { return "id"+d[0]+d[1]; }) 
      .attr("x",0) 
      .attr("y", 0) 
      .attr("transform", function(d) { 
       return "translate(" + x(d[0]) + "," + y(d[1]) + ")"; 
      }) 
      .append("text") 
      .attr("x", 0) 
      .attr("y", 0) 
      .attr("stroke", "black") 
      .text(function(d) {return d[2]; }); 


     // update 
     nodz.selectAll("text") 
      .text(function(d) { 
       return d[2]; }); 

     // another go 
     d3.selectAll("text") 
      .text(function(d) { 
       return d[2]; }); 


    } 


    // data in form [x pos, y pos, value to display] 

    var nodes = [[0,0,0],[1,1,0],[1, -1,0],[2,0,0], [2,2,0]]; 
    render(nodes); 

    nodes2 = [[0,0,1],[1,1,1],[1, -1,1],[2,0,1], [2,2,1], [2, -2,1]]; 
    render(nodes2); 

我所說的代碼繪製某些節點兩次。

我希望它來繪製五個節點在第一循​​環中的值爲零,

然後我其他項目添加到列表中,並更新所有的值設置爲1所以希望看到所有的值更改爲1並出現一個新節點。相反,我只看到最後一個被設置爲1.我嘗試添加一個唯一的id來將節點綁定到數據,但這不起作用。還嘗試重新選擇以查看數據是否已綁定。在所有教程中,我只是調用selectAll()。data()部分來更新數據,我錯過了什麼?

回答

1

.data()的第二個可選參數是一個告訴d3如何匹配元素的函數。這就是您需要比較您的ID的位置,請參閱the documentation。也就是說,它應該在你的情況下沒有標識符,因爲它默認匹配索引。

更新文本的問題在於,在調用.selectAll()之後,您需要再次調用.data()以讓d3知道您希望與該選擇匹配的內容(即新數據應該綁定到舊數據)。

+0

很高興我不是完全黯淡!已經將可選參數添加到數據,但它沒有什麼區別。 – PhoebeB

+0

如果我不使用封閉的g並直接轉到文本,它可以正常工作:http://enjalot.com/inlet/4126324/但數據應該更新,無論它是否連接到g元素或文本? – PhoebeB

+0

它應該與g元素一起工作。您是否在選擇所有文本元素後再次嘗試調用.data()? –

相關問題