簡単に言えば、トランジションを取得するための標準的な方法はなく、そうすることを意図していないということです。のように、それはサポートされていません。
少し長い答えは、目的のために、おそらく を使用してハッキングできるということ__transition__
です。アイデアは、存在するかどうかを確認__transition__
し、存在する場合は、存在しないまで待ってから、新しい (サブ) トランジションを開始することです。
そのためには、適切な関数を使用して選択プロトタイプを拡張すると役立ちます。
d3.selection.prototype.getTransition = function() {
if(this[0][0].__transition__) {
return this[0][0].__transition__[1];
} else return undefined;
}
これは非常にハックであり、選択範囲内にちょうど 1 つの遷移を持つ要素が 1 つだけある場合にのみ機能することに注意してください。しかし、あなたはアイデアを得る必要があります。
これで、この関数を使用して、遷移が実行されているかどうかを判断できます。
if(sel.getTransition() !== undefined) {
// transition is there
} else {
// no transition
}
残念ながら、__transition__
では遷移オブジェクトを再構築することはできません。つまり、以下は機能しません。
sel.getTransition().transition()...
したがって、現在実行中のサブトランジションが完了した後に開始するサブトランジションをシミュレートするには、 を使用setTimeout
して何かが実行されているかどうかを確認し、何も実行されていないとすぐに新しいトランジションを開始します。
function check() {
if(sel.getTransition() !== undefined) {
setTimeout(check, 100);
} else {
sel.transition().duration(1000)...;
}
}
check();
チェックの間隔 (ここでは 100 ミリ秒) を短くして、前のトランジションの直後のトランジションの印象を良くすることができます。
ここに完全な例があります。ほとんどの場合、トランジション オブジェクトへの参照をどこかに保持し、それを使用する方がはるかに簡単で優れていることに注意してください。この例は、ハックな概念実証としてのみ機能します。