Tôi đã tạo bố cục lực sử dụng d3 và nó hoạt động tốt. dữ liệu ban đầu của tôi được nạp từ một tập tin json và biểu đồ được vẽ bằng kỹ thuật tương tự như this d3.js example:Cập nhật các nút hiện có trong Bố cục Lực lượng d3
Bây giờ bảng xếp hạng là trên màn hình tôi cần phải bổ sung, cập nhật và loại bỏ các nút trên bay từ dữ liệu tôi nhận được qua một ổ cắm web. Tôi có thêm và loại bỏ các phương thức làm việc, nhưng tôi không thể tìm được cách chính xác để cập nhật các thuộc tính của nút hiện có.
Từ việc đọc tôi đã thực hiện, tôi thu thập kỹ thuật chính xác là thay đổi nguồn dữ liệu, sau đó cập nhật biểu đồ bằng cách sử dụng phương thức enter().
Để cập nhật một nút Tôi đang làm như sau:
function updateNode(id, word, size, trend, parent_id){
var updateNode = nodes.filter(function(d, i) { return d.id == id ? this : null; });
if(updateNode[0]){
updateNode.size = Number(size);
updateNode.trend = trend;
nodes[updateNode.index] = updateNode;
update();
}
}
Chức năng cập nhật sau đó cập nhật các nút với:
function update(){
node = vis.selectAll('.node')
.data(nodes, function(d) {
return d.id;
})
createNewNodes(node.enter());
node.exit().remove();
force.start();
}
function createNewNodes(selection){
var slct = selection.append('g')
.attr('class', 'node')
.call(force.drag);
slct.append('circle')
.transition()
.duration(500)
.attr('r', function(d) {
if(d.size){
return Math.sqrt(sizeScale(d.size)*40);
}
})
}
Tôi dùng phương pháp quyền này? Khi tôi thử mã này, nút mà tôi nhận được là datum khi cố gắng thiết lập thuộc tính radius trên vòng tròn là nút cuối cùng trong mảng nodes. I E. cái có chứa dữ liệu nút phân cấp thay vì một đối tượng nút đơn.
Bất kỳ con trỏ sẽ được đánh giá rất nhiều, tôi đã dành quá nhiều thời gian về vấn đề này :)
Tôi có cùng một vấn đề, mặc dù trong bối cảnh đơn giản hơn nhiều. Bạn đã tìm thấy một giải pháp? –
có thể đặt mã của bạn vào trình chỉnh sửa trực tuyến, ví dụ: http://phrogz.net/JS/d3-playground/#BlankDefault – ppoliani