d3 js输入方法不起作用

时间:2014-09-01 07:28:07

标签: javascript svg d3.js

问题在于d3 js,输入方法。以下是步骤和结果。

  1. 我使用data(source).enter()向svg添加了几个圆圈。我得到了确切的圈数。

  2. 数据源发生变化,新数据源的元素数量减少。所以我用exit来删除过多的圆圈。这也是一种魅力。删除其他圈子。

    circles.data(source2).exit().remove();
    
  3. 数据源再次更改,这次它的元素多于source2。在这种情况下,我使用data(source3).enter()添加其他圈子。但这从未发生过。

  4. 这是一个粗略重建问题的小提琴。 http://jsfiddle.net/tejasj/z59mgb03/1/

    更新:代码中带有注释的新fiddle

1 个答案:

答案 0 :(得分:3)

您的代码存在两个主要问题。一个是不是使用相同的选择进入/更新/退出,而是使用相同选择器的不同选择。也就是说,您的代码如下所示:

circles.data(...).enter()...
circles.data(...).exit()...

这会多次匹配数据(每次调用.data())并且无法实现您要查找的结果,因为状态(即DOM)在调用{{}之间的变化{1}}。也就是说,您只需匹配一次数据,获取输入选择和追加元素。现在,当您匹配数据时,将会有不同的元素,匹配将做一些不同的事情。

对多个选项进行操作的正确模式是保存选择:

.data()

第二个问题是你在var sel = circles.data(...); sel.enter()... sel.exit()... 上操作,其中包含"冻结"添加第一组圆后,DOM的视图。一旦您对其进行任何更新,这将不会反映实际的DOM。请明确选择您想要的元素:

circles

总而言之,这两件事情正在弄乱D3的数据匹配机制完全运作的方式,并且你得到的东西与你期望的完全不同。包含修正here的完整演示。