.remove()之后的d3回调函数

时间:2014-04-16 19:45:37

标签: javascript svg d3.js

我想知道我的所有线路何时被删除,以便我可以调用另一个功能。

svg.selectAll('line').transition().duration(2500)
    .style("stroke-opacity",0).remove();

我知道我可以在每次转换后使用.each(" end",mycallback)运行回调,但我只想在完成所有转换后运行一次。

如果我试试这个

svg.selectAll('line').transition().duration(2500)
   .style("stroke-opacity",0).remove().call(function(){console.log("yes");});

然后.call()在转换完成之前发生。

我可以添加一个window.setTimeout(),但有没有正确的方法呢?

1 个答案:

答案 0 :(得分:3)

正确的方法是使用.each("end", callback)。正如您所指出的,对于转换中的每个元素,都会调用一次。您无法更改此设置,但您可以添加一个计数器来跟踪已删除的元素数量:

d3.selectAll("div")
  .call(setupRemove)
  .transition().duration(500)
  .each("end", onRemove)
  .remove();

function setupRemove(sel) {
  counter = sel.size();
}
function onRemove() {
  counter--;
  if(counter == 0) {
    console.log("all done");
  }
}

完整演示here。请注意,在特殊情况下,当您想要在第一个设置完成时运行另一个转换时,您可以再次使用.transition()