问题在于d3 js,输入方法。以下是步骤和结果。
我使用data(source).enter()
向svg添加了几个圆圈。我得到了确切的圈数。
数据源发生变化,新数据源的元素数量减少。所以我用exit来删除过多的圆圈。这也是一种魅力。删除其他圈子。
circles.data(source2).exit().remove();
数据源再次更改,这次它的元素多于source2。在这种情况下,我使用data(source3).enter()
添加其他圈子。但这从未发生过。
这是一个粗略重建问题的小提琴。 http://jsfiddle.net/tejasj/z59mgb03/1/
更新:代码中带有注释的新fiddle。
答案 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的完整演示。