2017-04-11 29 views
0

這是一個跟進this questionD3.js:崩塌時更新要素之間的聯繫,徑向樹/擴大

我已成功地添加元素之間的聯繫,this JSFiddleoriginal hierarchical edge bundling由邁克·博斯托克發現的代碼使用的部分,並添加他們徑向collapsible tree的版本:

var bundle = d3.layout.bundle(); 

var line = d3.svg.line.radial() 
    .interpolate("bundle") 
    .tension(.85) 
    .radius(function(d) { return d.y; }) 
    .angle(function(d) { return d.x/180 * Math.PI; }); 

var middleLinks = packageImports(root); 

svg.selectAll("path.middleLink") 
      .data(bundle(middleLinks)) 
     .enter().append("path") 
      .attr("class", "middleLink") 
      .attr("d", line); 

的「packageImport」功能,可發現在底部。

我現在試圖更新這些鏈接,每當我崩潰/展開一個元素,我不知道如何去做。

function click(d) { 
    if (d.children) { 
    d._children = d.children; 
    d.children = null; 
    } else { 
    d.children = d._children; 
    d._children = null; 
    } 

    update(d); 
} 

另外值得一提的是,刪除以下行產生另一個正確的佈局沒有孩子暈倒:

當位置改變它可能有一些做的以下部分或更新功能內部的部件
root.children.forEach(collapse); 
update(root); 

出於這個原因,我不明白爲什麼點擊功能後,更新不考慮新的佈局。

隨意編輯JSFiddle

另一種可能性是內層不會移動,並且始終設置爲所有展開大小的間距,因此第二層只會出現或消失,不會改變第一層並仍然適合。您可能會建議此解決方案作爲答案,但它仍然計劃B

回答

3

你實際上並沒有更新他們的價值觀。下面所有的代碼不會是更新鏈接,你沒有任何的,

svg.selectAll("path.middleLink") 
.data(bundle(middleLinks)) 
.enter().append("path") 
.attr("class", "middleLink") 
.attr("d", line); 

您可以通過在新的外,更新現有的聯繫解決這個問題,

var middle = svg.selectAll("path.middleLink") 
    .data(bundle(middleLinks)); 
middle.enter().append("path") 
    .attr("class", "middleLink") 
    .attr("d", line); 
middle.attr("d", line); 

https://jsfiddle.net/1mgw37tk/