d3.js转换结束事件

d3.js转换结束事件,d3.js,transition,D3.js,Transition,我正在对selectAll()返回的一组节点应用转换。我原以为所有转换完成后都会触发end事件,但是每个(“end”,function)都会在每个转换结束时被调用 那么,有没有办法设置在所有选定节点上的转换完成后调用的回调 我应该为此使用call?但我在文档中没有看到它被用作结束回调 此外,我还可以在每个回调中运行计数器。但有没有办法知道有多少节点仍在等待完成转换?或选定节点组中当前节点的索引 我在链中有两个select()调用,如selectAll('.partition').selectAl

我正在对
selectAll()
返回的一组节点应用转换。我原以为所有转换完成后都会触发end事件,但是
每个(“end”,function)
都会在每个转换结束时被调用

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

我应该为此使用
call
?但我在文档中没有看到它被用作结束回调

此外,我还可以在每个
回调中运行计数器。但有没有办法知道有多少节点仍在等待完成转换?或选定节点组中当前节点的索引

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

我也有同样的问题

对每个元素执行回调

我已经用下划线一次法解决了这个问题


据我所知,没有一种内在的方法可以知道团队的最后一次转换何时完成,但有一些方法可以解决这个问题。我多次使用的一种方法是维护已完成的转换计数

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
}
以下是相关文档的链接:


这里有一个干净的方法来实现你想要的:

function endAll (transition, callback) {
    var n;

    if (transition.empty()) {
        callback();
    }
    else {
        n = transition.size();
        transition.each("end", function () {
            n--;
            if (n === 0) {
                callback();
            }
        });
    }
}
然后,您可以像这样轻松调用此函数:

selection.transition()
    .call(endAll, function () {
        console.log("All the transitions have ended!");
    });

即使转换是空的,这也会起作用。

请您将示例代码发布到JSFIDLE?来自Mike本人-谢谢我搜索了这个。我最终得到了一个类似的解决方案,可能与他们询问selectAll的结果完全相同。选择仅返回一个元素此答案不回答问题。它只运行一次,但不一定在所有转换完成后运行。这是一个重要的区别,因为在同一选择中,可能会有不同长度的过渡。e、 g.
duration(函数(d,i){return 100*i;})
注意,您不能在'end'事件上绑定两个函数:
转换。每个(“end”,f1)。每个(“end”,f2)
将只调用
f2
。因此,如果在同一个转换中使用
.each(“end”,…)
,则不应使用
endAll
。在2016年的版本4中,此代码将完全无效!将每个(“end”替换为on(“end”@ArslArsl)谢谢您的更新。我添加了正确文档的链接,并将代码更新到2016版本。
selection.transition()
    .call(endAll, function () {
        console.log("All the transitions have ended!");
    });