【问题标题】:When running a D3 update/enter/exit, how to ignore already exiting elements during the new exit?运行 D3 更新/进入/退出时,如何在新退出期间忽略已经退出的元素?
【发布时间】:2016-03-01 14:06:00
【问题描述】:

每个人都知道更新/进入/退出模式:

function update(data) {

  // DATA JOIN
  // Join new data with old elements, if any.
  var text = svg.selectAll("text")
      .data(data);

  // UPDATE
  // Update old elements as needed.
  text.attr("class", "update");

  // ENTER
  // Create new elements as needed.
  text.enter().append("text")
      .attr("class", "enter")
      .attr("x", function(d, i) { return i * 32; })
      .attr("dy", ".35em");

  // ENTER + UPDATE
  // Appending to the enter selection expands the update selection to include
  // entering elements; so, operations on the update selection after appending to
  // the enter selection will apply to both entering and updating nodes.
  text.text(function(d) { return d; });

  // EXIT
  // Remove old elements as needed.
  text.exit().transition().duration(2000).attr('transform',
    rotation = 25;
    return 'translate(' + d.x + ',' + d.y + ') rotate('+ rotation +' 30 30)';
  }).remove();
}

我的问题是:

如果我在退出仍在发生时(在 2000 毫秒转换窗口期间)运行此函数,如何防止在已经经历 exit 转换的元素上调用转换。

换句话说,当进行原始选择时,它包括已经处于exit().transition() 状态的元素。因此,如果这些元素尚未完成其转换和removed(),则会再次调用这些元素的退出转换。

我需要做一个过滤器吗? in transition while exiting 有测试吗?

【问题讨论】:

    标签: d3.js transition updates exit


    【解决方案1】:

    D3.js: Stop transitions being interrupted? 说给退出元素一个特殊的类,然后用它来只允许新退出的元素进入退出转换

    .exit()
         .filter(function(d,i) {
            return !d3.select(this).classed("exiting");
         })
         .classed("exiting", true)
         .transition()
         ...
    

    更大的问题是在您第二次点击时重新引入的任何数据,而这些数据仍受第一次退出过渡的影响。在您的示例中,这将在退出转换完成并在该元素上调用 remove 时消失您想要保留的元素。为了在过去解决这个问题,我在我的更新中添加了即时(零延迟,零持续时间)转换并输入选择以覆盖/写入退出选择,如果他们还没有自己的转换(如果有更好的方法有人告诉我)。

    这导致另一点:在输入和更新中设置.classed("exiting", false),因此在“退出”>“重新引入”>“再次退出”元素的情况下,.exiting 类未设置并且退出转换已激活。

    【讨论】:

    • 我真的不喜欢这个解决方案。根据我的口味,它使用类有点粗心。必须有某种方法可以测试元素是否处于退出过程中,或者我希望如此。
    • 好吧,您可以改为向数据集添加标志,.each (function(d,i) { d.exiting = true; }) 然后在过滤器中测试它,但有些可能也不像那样 - 特别是如果数据涉及多个视图。最后课程没有什么特别的:-)。似乎没有干净的方法,即 api 方法来询问元素是否参与转换:stackoverflow.com/questions/13844179/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    相关资源
    最近更新 更多