Tạo một yếu tố "chất" cũng đơn giản như phụ thêm một hoặc nhiều trẻ em đến yếu tố khác. Trong ví dụ của bạn, bạn muốn liên kết dữ liệu của mình với lựa chọn các thành phần <a>
và cung cấp cho mỗi số <a>
một đơn <circle>
con.
Trước hết, bạn cần chọn "a.node"
thay vì "circle.node"
. Điều này là do các siêu liên kết của bạn sẽ là các phần tử cha. Nếu không có phần tử cha mẹ rõ ràng và bạn chỉ muốn thêm nhiều phần tử cho từng mốc dữ liệu, hãy sử dụng <g>
, phần tử nhóm của SVG.
Sau đó, bạn muốn nối thêm một phần tử <a>
vào mỗi nút trong lựa chọn nhập. Điều này tạo ra các siêu liên kết của bạn. Sau khi đặt từng thuộc tính của siêu liên kết, bạn muốn cung cấp cho nó một con số <circle>
. Đơn giản: chỉ cần gọi .append("circle")
.
var node = vis.selectAll("a.node")
.data(nodes);
// The entering selection: create the new <a> elements here.
// These elements are automatically part of the update selection in "node".
var nodeEnter = node.enter().append("a")
.attr("class", "node")
.attr("xlink:href", "http://whatever.com")
.call(force.drag);
// Appends a new <circle> element to each element in nodeEnter.
nodeEnter.append("circle")
.attr("r", 5)
.style("fill", function(d) { return fill(d.group); })
node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
Hãy nhớ rằng D3 chủ yếu hoạt động trên lựa chọn các nút. Vì vậy, hãy gọi số .append()
khi nhập lựa chọn có nghĩa là mỗi nút trong lựa chọn sẽ nhận được một con mới. Công cụ mạnh mẽ!
Một điều nữa: SVG có its own <a>
element, đó là những gì tôi đã đề cập ở trên. Điều này khác với HTML! Thông thường, bạn chỉ sử dụng các phần tử SVG với SVG và HTML với HTML.
Nhờ @mbostock cho thấy tôi làm rõ đặt tên biến.
Nguồn
2012-02-11 11:34:22
Mặc dù tôi hiểu tại sao điều này lại hiệu quả đối với sáng tạo, nhưng nó có vi phạm khi cập nhật không? Vì append() hợp nhất các lựa chọn nhập và cập nhật, nó sẽ không thêm một vòng tròn mới vào các nút cũ mỗi lần cập nhật được gọi? –
Tôi đã cập nhật ví dụ để làm cho nó rõ ràng hơn. selection.append không * hợp nhất * bất kỳ lựa chọn nào, nhưng selection.enter(). append tự động thêm các phần tử vào lựa chọn cập nhật. Ví dụ ban đầu của tôi có vis.selectAll (…) .data (…) .enter(). Append (…). Điều này chỉ phụ thêm các phần tử vào lựa chọn nhập, do đó, không có vấn đề ở đó; điểm mấu chốt là lựa chọn nhập ban đầu chỉ chứa phần giữ chỗ cho các phần tử * mới * chưa tồn tại. –