2012-04-12 26 views
8

データ結合に関する簡単な質問。私にはそれぞれが含まれているいくつかの要素があるとします。最初にデータを結合すると、入力選択に追加する要素に自動的に継承されます。データ継承の継承

データが変更されてリバインドすると、要素が新しいデータを取得すると予想されていましたが、これは起こりませんでした。

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

これは、作成ケースとその後の再バインドの両方を処理します。私は明示的にこのような低レベルでデータを再バインドするために必要なこれを処理する

。しかし、それは親要素からのデータの最初の継承で自動的に起こるものであるため、[d]を返すことで本質的に冗長であるようです。

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

答えて

17

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

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

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

gElements.select("circle"); 

あなたがいる場合にのみ使用される書いたコードスニペットサークルがない場合は、新しいサークルを1つ作成します。これはThinking with Joinsに記載されています。書き込むコードは、入力と更新の両方で実行されるか、更新のみで実行されるかによって異なります。

+0

はい、正しく、私はあたり1サークルしかありません。私はselectがデータ継承を引き起こしたことに気づいていませんでしたが、ドキュメントでは実際にそのことを示しています。 これは、私が読取り専用操作として選択する行為を常に考えてきたように、ちょっとした直感的なことですが、この1つのケースでは実際にノードが変更されます。 –