Почему при использовании d3.js я должен вызывать selectAll после select при добавлении новых элементов в выделенную запись?

Предположим, у нас есть элемент svg без дочерних узлов:

<svg id = "bargraph" width = "400" height = "90" ></svg>

Предположим, у нас также есть массив данные:

var data = [10,20,30,40,50];

Этот код правильно добавляет новые элементы rect к элементу svg.

 d3.select("#bargraph")
 .selectAll("rect")
 .data(data)
 .enter()
 .append("rect")
 .attr("height", 10)
 .attr("width", function(d) { return d; })
 .attr("x", 0)
 .attr("y", function (d, i) { return i * 20; })
 .attr("fill", "blue");

Код ниже не добавляет новые элементы rect к элементу svg. Ты можешь сказать мне, почему?

 d3.selectAll("#bargraph rect")
 .data(data)
 .enter()
 .append("rect")
 .attr("height", 10)
 .attr("width", function(d) { return d; })
 .attr("x", 0)
 .attr("y", function (d, i) { return i * 20; })
 .attr("fill", "blue");
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
508
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Каждый раз, когда вы добавляете элементы, D3 добавляет их к выбранному родительскому элементу (ам). Вы не выбираете родительский элемент, вместо этого вы выбираете только те элементы, у которых есть указанный родительский элемент.

В вашем примере вы выбираете все rect, у которых есть родительский элемент с идентификатором bargraph, в то время как вы можете успешно обновить эти узлы с помощью:

d3.selectAll(#bargraph rect).data(data).attr(...)

Но использование следующего не добавит элементы в #bargraph (как вы утверждаете):

d3.selectAll("#bargraph rect).data(data).enter()

Здесь D3 просканирует весь документ, родительский элемент (d3.selectAll()) и вернет каждый соответствующий элемент, который соответствует критериям селектора. Выбор ввода затем создаст узел-заполнитель для каждого элемента в массиве данных, который не существует. Эти узлы создаются относительно выбора родительского элемента:

Conceptually, the enter selection’s placeholders are pointers to the parent element (documentation)

Так же, как мы можем выбирать прямоугольники и вводить круги, нет ничего, что связывает селектор и тип / размещение элемента, который мы хотим ввести.

В приведенном ниже примере я выбираю (и обновляю) круг SVG с помощью d3.selectAll("svg circle"), но я ввожу div - и мы видим, что div добавляется к элементу родительского выбора, который в случае d3.selectAll() является самим документом. , а не SVG (и не тело), ​​несмотря на мой селектор:

var svg = d3.select("body").append("svg");

svg.append("circle")
  .attr("cx",40)
  .attr("cy",40)
  .attr("r",20)
  .attr("fill","orange");

var circles = d3.selectAll("svg circle")
  .data(["steelblue","yellow"])
  .attr("fill",function(d) { return d; });

circles.enter().append("div")
  .html(function(d) { return d; });
  
<script src = "https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.0/d3.min.js"></script>

Хорошо, но почему D3 такой? В конечном счете, я не могу ответить, почему, потому что это результат решения, принятого другими людьми, а не мной. Я бы сказал, что некоторые рассуждения могут быть примерно такими:

Если такие селекторы, как (#bargraph rect), определяют, где должны быть введены элементы, тогда могут возникнуть определенные проблемы в зависимости от селектора:

  • Что делать, если вы не хотите вводить элементы в элемент с идентификатором bargraph - возможно, вы хотите ввести элементы в другом месте (но все же необходимо выбрать только определенные дочерние элементы элемента с идентификатором bargraph).
  • Если вы выбрали класс или каждый div / p / etc, к какому родительскому элементу будут добавлены вновь введенные элементы?
  • При выборе класса элемента вы, вероятно, захотите добавить к этому классу братьев и сестер, а не потомков.

Разумеется, последние два относятся к классу, а не к идентификатору, но поведение должно быть одинаковым независимо от строки селектора (различное поведение для идентификаторов, классов и элементов в строке селектора, вероятно, сбивает с толку). Выбранный подход, вероятно, был выбран теми, кто принимал решение, как наиболее чистый и понятный для программиста.

Здесь очень мало интересных вопросов / ответов, таких как этот, который после 35 просмотров не получил голосов. Странный.

Gerardo Furtado 13.03.2018 16:10

Ах, так оно и есть (я уверен, что вы испытали это на себе), хотя в последнее время мне повезло с несколькими вопросами, которые немного интереснее обычных.

Andrew Reid 14.03.2018 06:04

Ну, я теряю интерес к ТАК ... Все вопросы кажутся одинаковыми, только самые простые вещи.

Gerardo Furtado 14.03.2018 06:19

Что ж, вы определенно потратили на это очень много времени. Хотя в последнее время кажется медленнее, возможно, так лучше, чтобы я мог больше работать над некоторыми побочными проектами.

Andrew Reid 14.03.2018 06:31

Другие вопросы по теме