javascript - thinking in D3 - select vs append - Stack Overflow

Can someone explain like i'm 5 how this D3 syntax actually works?var link = svg.selectAll('.l

Can someone explain like i'm 5 how this D3 syntax actually works?

var link = svg.selectAll('.link')
    .data(links)
    .enter().append('line')
    .attr('class', 'link');

What it seems to do is just append links to the tree.

But how I read that is "select everything that is of class link, and append an attribute class=link". How it can select before those exist is puzzling.

Why is there a "select" before the items actually exist? Does select really mean "insert"?

Can someone explain like i'm 5 how this D3 syntax actually works?

var link = svg.selectAll('.link')
    .data(links)
    .enter().append('line')
    .attr('class', 'link');

What it seems to do is just append links to the tree.

But how I read that is "select everything that is of class link, and append an attribute class=link". How it can select before those exist is puzzling.

Why is there a "select" before the items actually exist? Does select really mean "insert"?

Share Improve this question asked Aug 31, 2016 at 4:52 dcsandcsan 12.4k17 gold badges92 silver badges139 bronze badges 5
  • 3 This link has step by step explanation - dashingd3js./binding-data-to-dom-elements – Gilsha Commented Aug 31, 2016 at 5:05
  • thanks. that does explain it and answers the obvious question that the API is counter intuitive, since it asks "but wait, what?" a few times. neanderthal. – dcsan Commented Aug 31, 2016 at 5:21
  • 1 You don't even need the last line .attr("class", ".link") for this to work. Read this: stackoverflow./documentation/d3.js/2135/selections/16948/… – Gerardo Furtado Commented Aug 31, 2016 at 5:24
  • This seems to explain it. WAT? Is right. Even the author knew it was confusing as he wrote it... bost.ocks/mike/join – dcsan Commented Aug 31, 2016 at 5:32
  • 1 It's confusing at first, but once you understand the core concept, the syntax bees more intuitive. The selectAll('.link') generalizes your use cases for binding data to elements. 1. There are no elements, therefore add all of the data. 2. There are some existing elements, but less than the size of data, so update the existing, and enter the new. 3. There are more existing elements than the size of data, so update the existing, and remove the rest. It's basically a one liner CRUD operation. – Eric Guan Commented Aug 31, 2016 at 6:15
Add a ment  | 

2 Answers 2

Reset to default 4

Line by line analysis would like below:

Select all the DOMs having class link.

var link = svg.selectAll('.link')

To all those links bind the data. Here data links is an array. links[0] is bound to first DOM if present. links[1] is bound to second DOM if present. ..so on

.data(links)
.enter()

Case 1: If the array links has 2 elements and the selection DOM elements has 0 elements. Then 2 line DOM will be appended to the svg DOM.

Case 2: If the array links has 2 elements and the selection DOM elements has 1 element. Then 1 new line DOM will be appended to the svg DOM.

Case 3: If the array links has 2 elements and the selection DOM elements has 2 or more elements. Then 0 new line DOM will be appended to the svg DOM.

    .append('line')
    .attr('class', 'link');

This would be a good read

I agree that it is totally confusing to have to make a selection before it even exists. BUT by calling data(someDataArray) on the selection, this placeholder selection is now bound to your data.

Now, for everything that will enter the data in someDataArray, d3 will append a corresponding SVG line (and attach the relevant data).

If someDataArray changes, d3 can change the appearance of the attached SVG node with update or even remove the old node that no longer has associated data with exit.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745143495a4613538.html

相关推荐

  • javascript - thinking in D3 - select vs append - Stack Overflow

    Can someone explain like i'm 5 how this D3 syntax actually works?var link = svg.selectAll('.l

    6小时前
    10

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信