2012-11-21 123 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()? –

相关问题