2014-04-16 51 views
3

我想知道我的所有行何時被刪除,所以我可以調用另一個函數。d3回調函數.remove()

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

我知道我可以使用。每次(「結束」,myCallBack函數)運行每次躍遷之後的回調,但我只希望在所有過渡完成一次運行它。

如果我嘗試這個

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

那麼.CALL()的過渡完成之前發生。

我可以添加一個window.setTimeout(),但是有沒有正確的方法來做到這一點?

回答

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()

+0

太棒了!在我的情況下,我不得不將它修改爲'counter = sel [0] .length;' – gneek

+0

'sel [0] .length'和'sel.size()'實際上應該是等價的。 –