我正在应用selectAll()
返回的一组节点的转换。我认为在所有转换完成后会触发结束事件,但在每次转换结束时会调用each("end",function)
。
那么有没有办法设置一个在所有选定节点完成转换后调用的回调?
我应该使用call
吗?但是我没有看到它在文档中的任何地方用作结束回调。
我也可以在each
回调中运行一个计数器。但有没有办法知道有多少节点仍在等待完成转换?或所选节点组中当前节点的索引?
我在selectAll('.partition').selectAll('.subpartition')
链中有两个select()调用
所以传递给每个回调的索引参数将旋转n次。
答案 0 :(得分: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
}
以下是相关文档的链接:
答案 1 :(得分:4)
这是一种实现目标的简洁方法:
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!");
});
即使过渡为空,这也会有效。
答案 2 :(得分:2)
我有同样的问题
使用每个元素执行回调
我已经使用下划线一次方法解决了这个问题
d3.select("#myid")
.transition()
.style("opacity","0")
.each("end", _.once(myCallback) );