16

によって返されたノードのグループにトランジションを適用していselectAll()ます。すべてのトランジションが終了した後に終了イベントが発生すると思っていましたeach("end",function)が、各トランジションの最後に呼び出されます。

選択したすべてのノードの遷移が終了した後に呼び出されるコールバックを設定する方法はありますか?

これに使うべきcallですか?しかし、ドキュメントのどこでも終了コールバックとして使用されているとは思いません。

eachまた、コールバック内でカウンターを実行できます。しかし、移行を完了するためにまだ保留中のノードの数を知る方法はありますか? または選択したノードのグループ内の現在のノードのインデックス?

私は 2 つの select() 呼び出しを連鎖させているselectAll('.partition').selectAll('.subpartition') ので、各コールバックに渡されたインデックス引数は n 回回転します。

4

3 に答える 3

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!");
    });

これは、トランジションが空の場合でも機能します。

于 2014-11-20T15:50:56.150 に答える
1

同じ問題がありました

各要素でコールバックが実行されること

アンダースコアワンスメソッドを使用して解決しました

http://underscorejs.org/#once

d3.select("#myid")
.transition()
.style("opacity","0")
.each("end", _.once(myCallback) );
于 2013-06-05T18:01:34.787 に答える