D3选择.join()使用类

klsxnrf1  于 2022-11-24  发布在  其他
关注(0)|答案(3)|浏览(202)

我尝试使用新的D3selection.join()范例在每个svg中绘制一个随机放置的圆。虽然我可以在选择器中使用id来实现这一点,但我还没有成功地将类用于选择器。由于我没有与每个圆或svg关联的数据,我只是合成了一个长度为所选元素个数的数组。我已经注解掉了返回的enter和update选择器,因为启用它们会导致异常:

TypeError: r.compareDocumentPosition is not a function
at Pt.order (https://cdnjs.cloudflare.com/ajax/libs/d3/5.15.1/d3.min.js:2:14333)
at Pt.join (https://cdnjs.cloudflare.com/ajax/libs/d3/5.15.1/d3.min.js:2:13931)
at addCircle (c:\github\xxxxxxx\xxxxx\wwwroot\testd3.html:48:19)
at HTMLButtonElement.onclick (c:\github\xxxxx\xxxxx\wwwroot\testd3.html:20:36)

第一个

dpiehjr4

dpiehjr41#

该问题是由以下行引起的:

svgs.select("circle")

根据d3.select文件:
选择与指定的选择器字符串匹配的第一个后代元素
若要选取数据系结的所有圆,应该改用d3.selectAll
改编片段如下:
第一个

ubby3x7f

ubby3x7f2#

我能想到的解决这个问题的唯一方法是按照Mehdi的建议使用selectAll(),将选择更改为.svg,并将**.append(circle)移动到更新中。我还发现.data()**是多余的。
第一个

qnakjoqk

qnakjoqk3#

以下是gitHub的评论:“...您正在从联接的Enter方法返回Enter选择;你需要返回一个实体化的选择代替...",可以得出结论,enter selection 不能直接返回,所以我发现一个选项是使用一个临时选择,源自.append()

// it works
.join(
  enter => enter
    .append("path")
    .attr("class", "item")
    .attr("fill", "red")
    .attr("d", arc)
)

// it does not work
.join(
  enter => { 
    enter
      .append("path")
      .attr("class", "item")
      .attr("fill", "red")
      .attr("d", arc);

    return enter;
  }
)

// it works!
.join(
  enter => { 
    let sel = enter
      .append("path")
      .attr("class", "item")
      .attr("fill", "red")
      .attr("d", arc);

    return sel;
  }
)

因此,使用最后一种方法,可以对选择进行自定义更改,添加新的svg子项等。

相关问题