Trong d3, selection.select
có tác dụng phụ của việc kế thừa dữ liệu từ các nút cha trong lựa chọn ban đầu. Điều này là mong muốn trong các tình huống mà dữ liệu được chia sẻ giữa các nút cha và con để dữ liệu cập nhật được liên kết với phụ huynh sẽ được đẩy tới đứa trẻ mà không yêu cầu tham gia dữ liệu ở mọi cấp.Ngăn chặn thừa kế dữ liệu không mong muốn bằng selection.select
Nhưng còn những tình huống mà ở đó không có mối quan hệ rõ ràng giữa dữ liệu bị ràng buộc với phụ huynh và dữ liệu bị ràng buộc với đứa trẻ? Trong trường hợp này, selection.select
có thể xảo quyệt vì chỉ đơn giản bằng cách chọn một nút mà bạn làm cho dữ liệu của nút đó bị ghi đè với dữ liệu gốc không liên quan.
Kỹ thuật tốt nhất để tránh điều này là gì? Tôi có thể nghĩ đến một vài lựa chọn nhưng không có vẻ gì tuyệt vời:
Luôn sử dụng
selection.selectAll
Luôn sử dụng bất kỳ nơi nào thừa kế dữ liệu tiềm ẩn. Tuy nhiên, đây không phải là lý tưởng vì nó làm cho việc sử dụngselection.select
không phù hợp vớid3.select
được sử dụng đơn giản để chọn một nút riêng lẻ (chính xác những gì tôi muốn làm vớiselection.select
).Sử dụng
d3.select
với descendents selector thay vìselection.select
để cách ly một nút cụ thể. Điều thuận tiện về việc sử dụngselection.select
là nó ngầm định hạn chế lựa chọn cho con cháu của lựa chọn bắt đầu. Đạt được điều này với bộ chọn không phải là gần như là tốt đẹp.
Cá nhân tôi không phải là người hâm mộ lớn có hiệu ứng phụ DOM trong một dạng cụ thể của một số chức năng được sử dụng phổ biến nhất trong API. Tôi nghĩ rằng tôi sẽ tìm thấy nó dễ dàng hơn để hiểu nếu có một cuộc gọi rõ ràng như selection.update(selector)
để đối xứng với selection.append
và selection.insert
.
Nhưng trong API hiện tại, tôi tự hỏi liệu có một số cơ chế khác có thể được sử dụng để phá vỡ kế thừa có hiệu quả khi sử dụng selection.select
không?
Có thể có điều gì đó cần nêu tại https://github.com/mbostock/d3/issues –
Tôi đồng ý rằng điều này có thể gây ra sự cố.Tôi đang sử dụng d3 để vẽ các đồ thị phức tạp với các phần tử svg lồng nhau, và bất cứ khi nào tôi muốn chọn phần tử con của cái gì đó, tôi sử dụng something.select() và dữ liệu mà tôi ràng buộc với các con bị mất !! Đã cho tôi một thời gian để tìm ra nơi mà vấn đề là ... Trong khi tôi không thể tranh luận rằng tính năng tiềm ẩn này có thể có ích trong một số trường hợp, nó cũng gây ra kết quả không mong muốn trong khác. Có một tùy chọn để vô hiệu hóa hành vi mặc định này sẽ được nhiều đánh giá cao. –
Nó có thể giúp loại bỏ các lựa chọn phụ của dữ liệu bằng '.datum ([])' [như thế này] (http://mistakes.io/#6239812)? Không chắc tôi có nghĩ đúng không. – Anko