d3では、selection.select
には元の選択の親ノードからのデータを引き継ぐという副作用があります。これは、データがすべてのレベルでデータ結合を必要とせずに親にバインドされた更新データが子にプッシュされるように、親ノードと子ノード間でデータが共有される状況で望ましい。selection.selectを使用して不要なデータ継承を防止する
しかし、親にバインドされたデータと子にバインドされたデータの間に明示的な関係がない場合はどうですか?この状況では、selection.select
は、単純にノードを選択することによって、ノードのデータに無関係な親データが詰まってしまうため、潜在的な可能性があります。
これを避けるにはどのような方法が最適ですか?私はオプションのカップルを考えることができますが、どちらも素晴らしい思えません:
は常に暗黙的なデータの継承が望まれている場合を除いてどこでも
selection.selectAll
を使用しています。しかし、selection.select
の使用がd3.select
と矛盾し、個々のノード(単にselection.select
で何をしたいか)を選択するために使用されるため、これは理想的ではありません。selection.select
の代わりにdescendents selectorを使用して、特定のノードを分離してください。d3.select
を使用してください。selection.select
を使用すると便利なことは、選択を暗黙のうちに開始選択の子孫に限定することです。セレクタでこれを達成することは、それほど素晴らしいことではありません。
個人的に、私はAPIの中で最も一般的に使用される機能のいくつかの一つの特定の形でDOM状態修飾副作用を持つ巨大なファンではありません。私はselection.update(selector)
のような明示的な呼び出しがselection.append
とselection.insert
と対称的であるかどうかを理解することが容易になると思う。
しかし、現在のAPIでは、selection.select
を使用すると、継承を効果的に破るために使用できる他のメカニズムがあるのでしょうか?
多分、https://github.com/mbostock/d3/issuesで提起するもの –
私はこれが問題になることに同意します。私は入れ子になったsvg要素を持つ複雑なグラフを描画するためにd3を使用しています。何かのchildren要素を選択したいときはいつでもsomething.select()を使用して、子孫にバインドされたデータは失われます。問題がどこにあるのか把握するのにしばらく時間をとった。この暗黙的な機能がいくつかのケースでは便利かもしれないと主張することはできないが、他のものでも望ましくない結果を引き起こす。このデフォルトの動作を無効にするオプションを持つことは非常に高く評価されます。 –
'.datum([])' [これのような](http://mistakes.io/#6239812)でデータのサブ選択を削除するのに役立ちますか?私がこの権利を考えているかどうかはわかりません。 – Anko