可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am applying a transition to a group of nodes returned by selectAll(). I thought the end event would fire after all transitions finished, but each("end",function) gets called at the end of each transition.
So is there any way to set a callback that will be called after transitions on all selected node finishes ?
Should I use call for this? but I don't see it used as end callback anywhere in documentation.
also I can run a counter inside each callback. but is there any way to know how many nodes are still pending to finish transition ? or index of current node in group of selected nodes ?
I've two select() calls in chain like selectAll('.partition').selectAll('.subpartition') so index argument passed to each callback will rotated n times.
回答1:
As far as I know there is not a built in way to know when the last transition of a group has finished but there are ways around it. One way that I have used several times involves maintaining a count of transitions that have finished.
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 }
Here are the links to the relevant documentation:
回答2:
Here's a clean way to accomplish what you want:
function endAll (transition, callback) { var n; if (transition.empty()) { callback(); } else { n = transition.size(); transition.each("end", function () { n--; if (n === 0) { callback(); } }); } }
You can then easily call this function like so:
selection.transition() .call(endAll, function () { console.log("All the transitions have ended!"); });
This will work even if the transition is empty.
回答3:
I had the same issue
that the call back gets executed with each element
I have solved that using underscore once method
http://underscorejs.org/#once
d3.select("#myid") .transition() .style("opacity","0") .each("end", _.once(myCallback) );