d3.js过渡结束事件

Dip*_*Sen 16 transition d3.js

我正在应用转换到返回的一组节点selectAll().我认为结束事件将在所有转换完成后触发,但each("end",function)在每次转换结束时调用.

那么有没有办法设置一个在所有选定节点完成转换后调用的回调?

我应该用call它吗?但我不认为它在文档中的任何地方都用作结束回调.

我也可以在each回调中运行一个计数器.但有没有办法知道还有多少节点尚待完成转换?或所选节点组中当前节点的索引?

我在链中有两个select()调用,selectAll('.partition').selectAll('.subpartition') 因此传递给每个回调的索引参数将旋转n次.

pay*_*ne8 10

据我所知,没有一种内置的方法可以知道一个小组的最后一次转换何时结束,但是有很多方法可以解决它.我多次使用的一种方法是保持已完成的转换计数.

var n = 0;

d3.selectAll('div')
   .each(function() { // I believe you could do this with .on('start', cb) but I haven't tested it
       n++;
   })
   .transition()
   .on('end', function() { // use to be .each('end', function(){})
       n--;
       if (!n) {
           endall();
       }
   })

function endall() {
    // your end function here
}
Run Code Online (Sandbox Code Playgroud)

以下是相关文档的链接:

  • 在2016年版本4中,此代码根本不起作用!将每个("end"替换为on("end") (4认同)
  • @ArslArsl 感谢您的更新。我添加了正确文档的链接,并将代码更新为 2016 版本。 (3认同)

小智 1

我遇到过同样的问题

每个元素都会执行回调

我已经解决了使用下划线一次方法

http://underscorejs.org/#once

d3.select("#myid")
.transition()
.style("opacity","0")
.each("end", _.once(myCallback) );
Run Code Online (Sandbox Code Playgroud)

  • 他们询问的是 selectAll。select 只返回一个元素 (2认同)
  • 这个答案没有回答问题。它只会运行一次,但不一定会在所有转换完成后运行。这是一个重要的区别,因为同一选择中的过渡可能会持续不同的长度。例如 `duration(function(d,i) {return 100 * i;})` (2认同)