如何在TreeView D3.js中调整路径链接

如何在TreeView D3.js中调整路径链接,d3.js,hyperlink,path,D3.js,Hyperlink,Path,var根; var boxWidth=160, 箱高=40, 持续时间=750;//转换持续时间(毫秒) var diagonal=d3.svg.diagonal() .投影(功能(d){ 返回[d.y+70,d.x]; }); //设置缩放和平移 /*var zoom=d3.behavior.zoom() .scaleExtent([1,1]) .on('zoom',function(){ attr(“transform”、“translate”(+d3.event.translate+))比

var根;
var boxWidth=160,
箱高=40,
持续时间=750;//转换持续时间(毫秒)

var diagonal=d3.svg.diagonal() .投影(功能(d){ 返回[d.y+70,d.x]; }); //设置缩放和平移 /*var zoom=d3.behavior.zoom() .scaleExtent([1,1]) .on('zoom',function(){ attr(“transform”、“translate”(+d3.event.translate+))比例(+d3.event.scale+); }) //偏移,以便第一次平移和缩放不会跳回原点 .翻译([150200])*/ var svg=d3.选择(#infovis”).追加(“svg”) .attr('preserveAspectRatio',“xMinYMin-meet”) .attr('视图框',“0 0 800 650”) /*.呼叫(缩放)*/ .append('g') //树的左侧填充,以便整个根节点都显示在屏幕上。 //TODO:找到更好的方法 .attr(“转换”、“翻译(100250)”); var tree=d3.layout.tree() //使用nodeSize,我们可以控制 //节点之间的分离。如果我们使用 //而d3将使用size参数 //动态计算要填充的间距 //可用空间。 .nodeSize([100200]) //默认情况下,表兄弟姐妹之间的距离比兄弟姐妹远。 //通过在所有情况下返回相同的值,我们可以绘制表兄妹 //与兄弟姐妹之间的距离相同。 .分离(职能({ 回报5; }) //告诉d3子节点是什么。记住,我们在画画 //一棵树,使祖先成为子节点。 .儿童(功能(人){ //如果伤者昏倒,则告知d3 //他们没有祖先。 如果(人崩溃){ 返回; }否则{ 返回人。\u父母; } }); var json=//不支持ablepasete数据 var jsonFromController=$(“#treeViewJsonStr”).val(); if(jsonFromController){ 试一试{ if(jsonFromController!=“未找到结果”){ json=jQuery.parseJSON(jsonFromController); json._parents.forEach(函数(gen2){ 塌陷(gen2); }); root=json; root.x0=0; root.y0=0; 画(根); }否则{ $(“#infovis”).html(“

”+jsonFromController); } }捕获(e){ 控制台日志(e); } } 功能点击(d){ 如果(d.儿童){ d、 _children=d.children; d、 children=null; }否则{ d、 儿童=d.\U儿童; d、 _children=null; } 如果(d.父母){ d、 parent.children.forEach(函数(元素){ 如果(d!==元素){ 塌陷(元素); } }); } //更新(d); } 函数绘制(源){ var nodes=tree.nodes(root).reverse(), 链接=树。链接(节点); nodes.forEach(函数(d){ d、 y=d.深度*250; }); //更新链接–alpha var link=svg.selectAll(“path.link”) .数据(链接、功能(d){ 返回d.target.id; }); //在父对象的上一个位置输入任何新链接。 link.enter()插入(“路径”,“g”) .attr(“类”、“链接”) .attr(“x”,箱宽) .attr(“y”,箱高) .attr(“d”,函数(d){ 变量o={ x:source.x0, y:source.y0 }; 返回对角线({ 资料来源:o, 目标:o }); }); //过渡链接到他们的新位置。 link.transition() .持续时间(持续时间) .attr(“d”,对角线); //将退出节点转换到父节点的新位置。 link.exit().transition() .持续时间(持续时间) .attr(“d”,函数(d){ 变量o={ x:source.x, y:来源,y }; 返回对角线({ 资料来源:o, 目标:o }); }) .remove(); //将旧位置隐藏起来,以便过渡。 nodes.forEach(函数(d){ d、 x0=d.x; d、 y0=d.y; }); //更新节点 var node=svg.selectAll(“g.person”) //我们正在传递的函数为d3提供了一个id //这样它就可以跟踪数据的添加和删除时间。 //如果只绘制一次树,则无需执行此操作 //如基本示例所示。 .data(节点、函数(person){return person.id;}); //添加任何新节点 var nodeEnter=node.enter().append(“g”) .attr(“类”、“人”) //在其子框的右侧添加新节点。 //他们将被转移到适当的位置。 .attr('transform',函数(person){ 返回“translate('+source.y0+','+source.x0+'); }) .on('click',togglePerson); //绘制矩形人物框。 //启动大小为0的新框,以便 //我们可以把它们改成合适的尺寸。 nodeEnter.append(“rect”) 艾特先生({ x:0,, y:0, 宽度:0, 身高:0 }); nodeEnter.append(“外来对象”) .attr(“x”,-90) .attr(“y”,-15) .attr(“宽度”,160) .attr(“高度”,10) .append(“xhtml:tspan”) .html(函数(d){ 如果(d.类型=“发票”){ 返回“+resizeText(d.name)+”
“+d.amount+”; }否则如果(d.type==“任务订单”){ 返回“+resizeText(d.name)+”; } 返回“+resizeText(d.name)+”; }) .on('click',函数(d,i){ 如果(d.type=='Invoice'){//do stuff //多斯图夫 loadInvoiceView(d.id、d.status、d.invoiceType); } }); //更新旧节点和新节点的位置 var nodeUpdate=node.transition() .持续时间(持续时间) .attr(“转换”,函数(d){ 返回“translate”(“+(d.y)+”,“+d.x+”);}); //把盒子长到合适的大小 nodeUpdate.select('rect') 艾特先生({ x:-(箱宽/2), y:-(箱高/2), 宽度:boxWidth, 高度:箱高 }) .样式(“笔划”,功能(d){ 如果(d.type==“发票”){ 返回“#f2ab
   //update the nodes here
  //node code here
      // Update the linksâ¦
   var link = svg.selectAll("path.link")
       .data(links, function (d) {
       return d.target.id;
   });

   // Enter any new links at the parent's previous position.
   link.enter().append("path", "g")
       .attr("class", "link")
       .attr("x", boxWidth )
       .attr("y", boxHeight)
       .attr("d", function (d) {
       var o = {
           x: source.x0,
           y: source.y0
       };
       return diagonal({
           source: o,
           target: o
       });
   });

   // Transition links to their new position.
   link.transition()
       .duration(duration)
       .attr("d", diagonal);

   // Transition exiting nodes to the parent's new position.
   link.exit().transition()
       .duration(duration)
       .attr("d", function (d) {
       var o = {
           x: source.x,
           y: source.y
       };
       return diagonal({
           source: o,
           target: o
       });
   })
       .remove(); 
  var diagonal = d3.svg.diagonal()
    .projection(function (d) {
      if (d.depth == 1){
        return [d.y+boxWidth/2, d.x];//now line will end to the box width for depth 1.
      } else {
        return [d.y+70, d.x];
      }

}); 
  var diagonal = d3.svg.diagonal()
    .projection(function (d) {
      if (d.depth == 1){
        return [d.y-boxWidth/2, d.x];//now line will end to the box width for depth 1.
      } else {
        return [d.y+70, d.x];
      }

});
   nodes.forEach(function (d) {
       d.y = d.depth *450;
   });