我正在學習D3的過程中,偶然發現了一個我一直無法找到答案的問題。我不確定,如果我的問題是因爲我沒有習慣圖書館的慣例,或者是因爲我目前沒有意識到的程序。我還應該提到,我只在6月份開始做與網絡有關的事情,所以我對JavaScript很新。D3,嵌套追加和數據流
假設我們正在構建一個工具,可以爲用戶提供包含相應圖像的食物列表。並且讓我們添加額外的約束條件,即每個列表項需要用唯一ID標記,以便可以鏈接到另一個視圖。我解決這個問題的第一個直覺就是創建一個列表<div>
的每個都有自己的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; });
現在,有關將<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
)被處理更像一個基團而不是單獨的實體,並且如果代碼反映以及這將是很好。
太棒了!我沒有意識到,孩子節點具有相同的數據範圍。感謝您的澄清:) –
Upvoted使用'selection.each'。 – Yawar
如果使用'selection.each'插入分組(或嵌套)節點,請記住在更新步驟中也可以使用'selection.each'(也可以用於退出步驟)。 – npdoty