我正在最终学习 D3 的过程中,我偶然发现了一个我无法找到答案的问题。我不确定我的问题是因为我没有习惯性地思考图书馆,还是因为我目前不知道的程序。我还应该提一下,我在 6 月份才开始做与网络相关的事情,所以我对 javascript 还很陌生。
假设我们正在构建一个工具,为用户提供带有相应图像的食物列表。并且让我们添加额外的约束,即每个列表项都需要用唯一 ID 标记,以便可以链接到另一个视图。我解决这个问题的第一个直觉是创建一个<div>
's 列表,每个都有自己的 ID,每个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; });
现在,在其中添加 a<div>
和 a<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
)更像是一组而不是单独的实体,如果代码也能反映这一点,那就太好了。