Tôi đang trong quá trình học cuối cùng D3 và tôi tình cờ gặp một vấn đề mà tôi không thể tìm thấy câu trả lời. Tôi không chắc chắn nếu câu hỏi của tôi là bởi vì tôi không nghĩ về thành ngữ với thư viện, hoặc nếu đó là vì một thủ tục mà tôi hiện không biết. Tôi cũng nên đề cập đến rằng tôi đã chỉ bắt đầu làm những thứ liên quan đến web vào tháng Sáu, vì vậy tôi khá mới với javascript.D3, phụ đề lồng nhau và luồng dữ liệu
Giả sử chúng tôi đang tạo công cụ cung cấp cho người dùng một danh sách các loại thực phẩm có hình ảnh tương ứng. Và cho phép thêm vào ràng buộc bổ sung mà mỗi mục danh sách cần được gắn nhãn bằng một ID duy nhất để nó có thể được liên kết với một chế độ xem khác. Trực giác đầu tiên của tôi để giải quyết vấn đề này là tạo ra một danh sách gồm <div>
mỗi ID có ID riêng của họ, trong đó mỗi div
có <p>
và <img>
riêng. HTML kết quả sẽ giống như thế:
<div id="chocolate">
<p>Chocolate Cookie</p>
<img src="chocolate.jpg" />
</div>
<div id="sugar">
<p>Sugar Cookie</p>
<img src="sugar.jpg" />
</div>
Các dữ liệu cho công cụ này là trong một mảng JSON, nơi một JSON cá nhân trông giống như:
{ "label": "sugar", "text": "Sugar Cookie", "img": "sugar.jpg" }
Có cách nào để làm tạo ra HTML trong một ngã swoop? Bắt đầu với một trường hợp cơ sở của việc thêm một div, mã có thể giống như thế:
d3.select(containerId).selectAll('div')
.data(food)
.enter().append('div')
.attr('id', function(d) { return d.label; });
Bây giờ, những gì về việc thêm một <div>
với một <p>
trong nó? suy nghĩ ban đầu của tôi là phải làm một cái gì đó như:
d3.select(containerId).selectAll('div')
.data(food)
.enter().append('div')
.attr('id', function(d) { return d.label; })
.append('p').text('somethingHere');
Nhưng, tôi thấy hai vấn đề với điều này: (1) làm thế nào để bạn nhận được dữ liệu từ các yếu tố div
, và (2) làm thế nào bạn có thể thêm nhiều trẻ em cùng một phụ huynh trong một chuỗi khai báo? Tôi không thể nghĩ ra cách để thực hiện bước thứ ba, nơi tôi sẽ nối thêm vào img
.
Tôi đã đề cập đến lựa chọn lồng nhau trên một bài đăng khác, trỏ đến http://bost.ocks.org/mike/nest/. Nhưng là lựa chọn lồng nhau, và do đó phá vỡ các phụ thêm vào ba khối, thích hợp/thành ngữ cho tình huống này? Hay thực sự là một cách được xây dựng tốt để tạo thành cấu trúc này trong một chuỗi khai báo? Nó có vẻ như có thể có một cách với các cuộc bầu cử được đề cập trên https://github.com/mbostock/d3/wiki/Selections, nhưng tôi không đủ quen thuộc với ngôn ngữ để kiểm tra giả thuyết đó.
Từ cấp độ khái niệm, ba đối tượng này (div
, p
và img
) được coi như một nhóm chứ không phải các thực thể riêng biệt, và sẽ tốt hơn nếu mã phản ánh điều đó.
Tuyệt vời! Tôi đã không nhận ra rằng các nút con có cùng phạm vi dữ liệu. Cảm ơn bạn đã làm rõ :) –
Được bỏ phiếu để sử dụng 'selection.each'. – Yawar
Nếu bạn sử dụng 'selection.each' để chèn các nút được nhóm (hoặc lồng nhau), hãy nhớ sử dụng' selection.each' cho bước cập nhật (và cũng có thể cho bước thoát). – npdoty