2016-06-15 1 views
0

d3のメンタルモデルでは、.select()を呼び出すと、選択にどのデータがバインドされるのかを変更してはいけません。バインドされたデータを.select()で呼び出すのがなぜですか?

私は.select()を呼び出すケースに遭遇し、それを機能を渡してきたがバインドされたデータを変更し、私は私のメンタルモデルと間違って何の説明をいただければ幸いです。ここで

は、最小限のケースです:

// Setup 
    let body = d3.selectAll('body') 
    let exampleData = 
     [ 
      {_id:"groupOne", items:['one','two']}, 
      {_id:"groupTwo", items:['three','four']} 
     ]; 
    // Add some divs 
    body.selectAll('div').data(exampleData).enter().append('div'); 

    // Add some p children of the divs 
    body.selectAll('div').selectAll('p').data((d)=>d.items).enter().append('p').text((d)=>d); 

// Issue 
    console.log(body.selectAll('div').data()); // data is the same as exampleData 
    body.selectAll('p').select(function(){return this.parentNode}); // Select parents of all p 
    console.log(body.selectAll('div').data()); // Data is now ["two","four"] 

、ここではbl.ocks.orgのライブバージョンです。 D3の文書から

答えて

1

https://github.com/d3/d3/wiki/Selections#select

現在の要素は、データが関連付けられている場合、このデータが返さダイレクト選択によって継承され、自動的に新たに選択された要素に結合されています。

ですから、(このデータは返さダイレクト選択によって継承され、自動的に新たに選択した要素にバインドされ["one,"two","three","four"]データを持っているbody.selectAll('p')とp要素を選択し

次にあなたがサブセレクションを作ります.select(function(){return this.parentNode});

副選択は '反復' 4回になります。 divとなるものは、 と
<div><p>one</p><p>two</p></div>となり、最後の2つはとなります。最初の反復について

。 parentNode <div><p>one</p><p>two</p></div>
は(継承)データ"one"を取得します。 2回目の繰り返し:データ"two"。第3回の反復で

。 parentNode <div><p>three</p><p>four</p></div>
はデータ"three"を取得します。 4回目の繰り返し:データ"four"

しかし、私はあなたが何をしようとしているが、このようなものだと思う:(return文なし)

body.selectAll('p').select(this.parentNode); // Select parents of all p 
console.log(body.selectAll('div').data()); // Data is now the same as exampleData 

+0

おかげで - ここに私の一部にRTFMに失敗したことを - 私は、 .selectが状態を変更したことに驚きました。何とか.data()コールまで変更がないと思いました。しかし、私はあなたが私の「選択親」機能を声明に変えなければならないと言っている理由は分かりません。私はそれを試して、私はnullの選択で終わる。選択のためのドキュメントは、セレクタまたは関数を取ると言う...私はそこに直接要素を渡すことについて何かを見つけることができません。何か不足していますか? – foobarbecue

+0

また、データコンテンツを変更せずに親を選択する方法はありますか? – foobarbecue

+1

@foobarbecueねえ!遅く返事をして申し訳ありません(私は眠りにつきました; P)私はあなたが私の提案でヌルになってしまったのかどうかわかりませんが、ここで私が意味していたことのバイブルです。 https://jsfiddle.net/fchr2f3o/ – echonax

関連する問題