【问题标题】:Can enter() selection be reused after append/insert?追加/插入后可以重用 enter() 选择吗?
【发布时间】:2012-05-29 23:56:31
【问题描述】:

我有一个场景,我想使用数据连接为每个数据元素附加 2 个新元素。

我最初是在做这样的事情:

var y = d3.selectAll("line")
    .data([123, 456]);

y.enter().append("line");  // assume attr and style set
y.enter().append("line");

y.transition()...

在我仔细考虑之前,我期望在我的转换中使用的更新选择将包含来自输​​入选择的合并附加。但当然这不起作用,因为每个数据元素的选择中只有 1 个插槽。

所以我更改了代码,使其仍然使用相同的 enter() 选择两次,但随后为新元素重新选择以进行转换。

这种方法有效,但我的问题是这是否是推荐的处理方式。附加/插入后是否应该确保停止使用 enter()?或者只要我记得更新选择将只包含最后创建的元素就可以使用它来创建多个元素?

如果事实证明这是错误的,有什么更好的方法来实现这一点?

【问题讨论】:

    标签: d3.js


    【解决方案1】:

    没有。数据连接的目的是synchronize elements with data,根据需要创建、删除或更新元素。如果两次创建元素,元素将不再与绑定的数据数组一一对应。

    如果您希望每个数据对应两个元素,则首先附加一个组(G)元素以建立从数据到元素的一对一映射。然后根据需要附加子元素。生成的结构是这样的:

    <g>
      <line class="line1"></line>
      <line class="line2"></line>
    </g>
    <g>
      <line class="line1"></line>
      <line class="line2"></line>
    </g>
    

    例如:

    var g = svg.selectAll("g")
        .data([123, 456]);
    
    var gEnter = g.enter().append("g");
    gEnter.append("line").attr("class", "line1");
    gEnter.append("line").attr("class", "line2");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 2018-02-21
      • 2017-03-02
      相关资源
      最近更新 更多