8

データの結合に関する簡単な質問。それぞれに。が含まれている要素があるとします。最初にデータをに結合すると、Enter選択に追加した要素によって自動的に継承されます。

データが変更されて再バインドすると、要素が新しいデータを取得することを期待していましたが、これは発生しませんでした。

これを処理するには、次のように下位レベルでデータを明示的に再バインドする必要がありました。

gElements.selectAll("circle")
    .data(function(d) { return [d]; }
    .enter().append("circle");

これは、作成ケースとその後の再バインドの両方を処理します。ただし、[d]を返すことは基本的に、親要素からのデータの最初の継承で自動的に行われるため、冗長なようです。

このアプローチはこれを処理する正しい方法ですか、それとも私はここのどこかで混乱していますか?

4

1 に答える 1

17

selection.dataを介してデータを要素にバインドすると、それらの要素にバインドされたデータが更新されます。ただし、新しいデータを子孫要素に自動的に伝播することはありません。これは自分で行う必要があります。

selection.appendに対応するselection.selectを呼び出すと、親からのデータは、選択された要素ごとに選択された子にバインドされます。selection.selectAllを呼び出すと、データはバインドされないため、後でselection.dataを呼び出して、新しいデータを子にバインドする必要があります。

より多くの文脈を見ずにあなたの質問に答えることは難しいです。のデータを更新しgElements、各G要素に1つの円が含まれている場合、selection.selectを使用して親Gから子円にデータを伝播できます。

gElements.select("circle");

作成したコードスニペットは、円がない場合に1つの新しい円を作成する場合にのみ使用されます。これについては、「結合を使用した思考」で説明されています。作成する正確なコードは、入力と更新の両方で実行されるのか、更新のみで実行されるのかによって異なる場合があります。

于 2012-04-12T19:01:08.343 に答える