Я в процессе окончательного изучения D3, и я наткнулся на проблему, на которую я не смог найти ответ. Я не уверен, что мой вопрос заключается в том, что я не думаю об идиоматическом отношении с библиотекой, или если это из-за процедуры, о которой я в настоящее время не знаю. Я должен также упомянуть, что я только начал заниматься веб-вещами в июне, поэтому я довольно новичок в javascript.
Скажем, что мы создаем инструмент, который дает пользователю список продуктов с соответствующими изображениями. И добавим дополнительное ограничение, чтобы каждый элемент списка был помечен уникальным идентификатором, чтобы его можно было связать с другим видом. Моя первая интуиция для решения этой проблемы - создать список <div>
, каждый со своим собственным идентификатором, где каждый div
имеет свои собственные <p>
и <img>
. Полученный HTML-код будет выглядеть примерно так:
<div id="chocolate">
<p>Chocolate Cookie</p>
<img src="chocolate.jpg" />
</div>
<div id="sugar">
<p>Sugar Cookie</p>
<img src="sugar.jpg" />
</div>
Данные для этого инструмента находятся в массиве JSON, где отдельный JSON выглядит следующим образом:
{ "label": "sugar", "text": "Sugar Cookie", "img": "sugar.jpg" }
Есть ли способ сделать HTML-код одним махом? Начиная с базового случая добавления div, код может выглядеть примерно так:
d3.select(containerId).selectAll('div')
.data(food)
.enter().append('div')
.attr('id', function(d) { return d.label; });
Теперь, как насчет добавления <div>
с <p>
в нем? Моя первоначальная мысль заключалась в том, чтобы сделать что-то вроде:
d3.select(containerId).selectAll('div')
.data(food)
.enter().append('div')
.attr('id', function(d) { return d.label; })
.append('p').text('somethingHere');
Но я вижу две проблемы с этим: (1) как вы получаете данные из элемента div
и (2) как вы можете добавить несколько дочерних элементов к одному и тому же родительскому объекту в одной декларативной цепочке? Я не могу придумать способ сделать третий шаг, на котором я бы добавил на img
.
Я нашел упоминание о вложенном выборе в другом сообщении, которое указывало на http://bost.ocks.org/mike/nest/. Но является ли вложенный выбор и, следовательно, разбивает приложения на три части, подходящие/идиоматические для этой ситуации? Или есть действительно хорошо построенный способ сформировать эту структуру в одной цепочке деклараций? Похоже, что может быть способ с подвыборками, упомянутыми в https://github.com/mbostock/d3/wiki/Selections, но я недостаточно хорошо знаком с языком для проверки этой гипотезы.
С концептуального уровня эти три объекта (div
, p
и img
) обрабатываются больше как одна группа, а не отдельные сущности, и было бы неплохо, если бы код тоже отражал это.