d3.js:绑定数据和输入元素后属性设置不起作用

bam*_*oom 2 html javascript css d3.js

D3.js从一开始就在学习。但是,在我正在阅读的教程的“输入元素”部分中,我无法获得与文章中相同的结果。

svg.selectAll("circle")
    .data([32, 57, 112, 293])
  .enter().append("circle")
    .attr("cy", 60)
    .attr("cx", function(d, i) { return i * 100 + 30; })
    .attr("r", function(d) { return Math.sqrt(d); });
Run Code Online (Sandbox Code Playgroud)

绑定数据后,进入元素再追加一个circle,属性设置只适用于追加的circle,而不是所有的圆圈。

我特此附上代码笔

这种行为是正常的还是我误解了什么?

Ger*_*ado 5

是的,这是正常行为。这是您的问题:您在 SVG 中已经有 3 个圆圈。因此,当您绑定数据时,您的“输入”选择只有一个圆圈(第四个),并且所有属性都只为最后一个圆圈设置。

进入/更新/退出选择基于数据和元素之间的关系。当您绑定数据(数组中的 4 个数字)时,SVG 中已经有 3 个元素。因此,您有:

  • 输入选择:数据不对应任何元素。在你的情况下,1圈。

  • 更新选择:一个元素对应的数据。在你的情况下,3个圆圈。

  • 退出选择:元素不对应任何数据。在你的情况下,零圈。

要重新绘制所有 4 个圆圈(3 个以前的和一个新的),您必须执行以下操作:

var svg = d3.select("svg");

var myCircles = svg.selectAll('circle')
    .data([32, 57, 112, 293]);//binds the data

myCircles.enter().append("circle");//enter selection

myCircles.attr("cy", 60)
    .attr("cx", function (d, i) {
      return i * 100 + 30;
    })
    .attr("r", function(d) {
      return Math.sqrt(d);
    });//updates all circles
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以为“输入”和“更新”选择设置属性。这是你更新的 Pen(我设置了 1 秒的 setTimeout,只是为了让你看到更改前原来的 3 个圆圈):http : //codepen.io/anon/pen/vKxZxX

请注意,我不是将您的代码与 Bostock 的教程进行比较,也不是说您做错了什么。我只是在解释为什么您的代码没有更新 4 个圆圈。