2012-10-20 35 views
21

Tôi đang sử dụng một trong các ví dụ bố cục lực (http://bl.ocks.org/1153292) để hiển thị một mạng trên trang web của tôi.Cách cập nhật các phần tử bố trí lực D3 khi dữ liệu cơ bản thay đổi

Tôi cho phép người dùng chọn loại liên kết để xem tại bất kỳ thời điểm cụ thể nào. Tôi nhận thấy rằng khi tôi chọn xem liên kết loại A, sau đó thêm liên kết loại B và sau đó loại bỏ liên kết loại A vẫn còn liên kết của loại B được trình bày với A màu sắc.

Đây là mã chạy để thêm liên kết vào biểu đồ svg. Tôi đang thay đổi mảng this.links bằng cách thêm và xóa liên kết khỏi mảng đó. Như bạn có thể thấy tôi thiết lập các thuộc tính lớp nhưng nó không được cập nhật - nó còn lại của loại liên kết A.

var path = svg.append("svg:g") 
    .selectAll("path") 
    .data(this.links) 
    .enter() 
    .append("svg:path") 
    .attr("class", function(d) { return "link " + d.type; }) 
    .attr("marker-end", function(d) { return "url(#" + d.type + ")"; }); 

Tôi hiện làm việc xung quanh vấn đề này bằng cách cập nhật các thuộc tính lớp bên trong hàm đánh dấu nhưng điều này tắt khóa học nguyên nhân nhiều công việc không cần thiết.

Tôi đọc rằng thao tác nhập trả lại lựa chọn đã hợp nhất của các phần tử tồn tại và cả các thành phần mới để hoạt động của trình điều khiển nên cập nhật thành phần hiện tại và đặt giá trị mới.

Tôi đang thiếu gì?

Trả lời

19

Tôi đã tìm thấy answer in this post

var circle = svg.selectAll("circle") 
    .data(data); 

circle.enter().append("circle") 
    .attr("r", 2.5); 

circle 
    .attr("cx", function(d) { return d.x; }) 
    .attr("cy", function(d) { return d.y; }); 

circle.exit().remove(); 

Câu trả lời là tôi cần phải gọi attr hành trên kết quả của selectAll.data chứ không phải là kết quả của các nhà điều hành append.

+1

Ido, tôi biết rằng đây là một bài đăng cũ, nhưng tôi tin rằng tôi đang gặp cùng một vấn đề mà bạn đang có, và tôi vẫn không hiểu giải pháp này. Bạn có thể giải thích cách nó hoạt động - cách nó giải quyết vấn đề ban đầu của bạn? Cảm ơn bạn. – Mars

+3

Giải pháp hoạt động vì các cập nhật attr của cx và cy nằm ngoài ngữ cảnh enter(), vì vậy chúng xảy ra mọi lúc. Trong mã ban đầu, các hàm attr được gọi trong ngữ cảnh enter(), vì vậy chúng chỉ được tạo một lần theo nhận dạng đối tượng. Tôi đã học được gì về các chức năng chính làm đối số thứ hai cho dữ liệu(): http://bost.ocks.org/mike/constancy/ – velotron

4

Có một ví dụ tại http://bl.ocks.org/1095795 cho thấy việc thêm và xóa các nút khỏi bố cục có hướng lực. Các liên kết và nút phải được xử lý riêng biệt và bố cục lực phải được khởi động lại.

function restart() { 
    var link = vis.selectAll("line.link") 
     .data(links, function(d) { return d.source.id + "-" + d.target.id; }); 

    link.enter().insert("svg:line", "g.node") 
     .attr("class", "link"); 

    link.exit().remove(); 

    var node = vis.selectAll("g.node") 
     .data(nodes, function(d) { return d.id;}); 

    var nodeEnter = node.enter().append("svg:g") 
     .attr("class", "node") 
     .call(force.drag); 

    nodeEnter.append("svg:image") 
     .attr("class", "circle") 
     .attr("xlink:href", "https://d3nwyuy0nl342s.cloudfront.net/images/icons/public.png") 
     .attr("x", "-8px") 
     .attr("y", "-8px") 
     .attr("width", "16px") 
     .attr("height", "16px"); 

    nodeEnter.append("svg:text") 
     .attr("class", "nodetext") 
     .attr("dx", 12) 
     .attr("dy", ".35em") 
     .text(function(d) { return d.id }); 

    node.exit().remove(); 

    force.start(); 
} 
+1

Điều đó là không đủ. Tôi đang thêm và xóa các liên kết và vấn đề là nó không theo thứ tự. Khi tôi chọn để xem các liên kết của loại A mảng liên kết là [A1, A2, A3] thì tôi chọn để xem các liên kết của loại B mảng là [A1, A2, A3, B1, B2] sau đó tôi chọn để không nhìn thấy loại Một mảng là [B1, B2]. D3 sau đó chọn để lại 2 yếu tố và loại bỏ 3 nhưng sau đó tôi phải cập nhật hai yếu tố bởi vì họ hiện đang bị ràng buộc để A1 và A2 và tôi cần chúng được ràng buộc để B1 và ​​B2. Tôi quản lý để làm điều đó bằng cách lưu vis.selectAll ("g.Node"). Data (nodes) và cập nhật điều đó. –

+0

Nếu bạn tạo một jsfiddle cho thấy những gì bạn đang làm và vấn đề là gì thì chúng tôi có thể giúp tìm ra giải pháp tốt hơn. – Bill

Các vấn đề liên quan