2017-12-13 4 views
0

既存のグラフに新しいノードを追加しようとすると、add関数はすべて新しいグラフで終了します。ここに私のcodeです:私は別のエッジにページ上の元のグラフスタックと新しいものaddに呼び出した場合d3 js再描画グラフ既存ノードの再追加

function Graph(elementId) { 
    var svg; 
    var simulation; 
    var mNodesData = []; 
    var mEdgesData = []; 
    var mNode = null; 
    var mLink = null; 
    var elementId; 
    var heightDelta = 100; 
    var width = window.innerWidth; 
    var height = window.innerHeight - heightDelta; 

    return { 
     init: function() { 
      svg = d3.select('#' + elementId) 
       .append("svg") 
       .attr("width", width) 
       .attr("height", height); 

      simulation = d3.forceSimulation() 
       .force(".edge", d3.forceLink()) 
       .force("charge", d3.forceManyBody().strength(-600)) 
       .force("center", d3.forceCenter(width/2, height/2)); 
     }, 
     clearGraph: function() { 
      $('#' + this.elementId).empty(); 
     }, 
     getNodes: function() { 
      return mNodesData; 
     }, 
     getEdges: function() { 
      return mEdgesData; 
     }, 
     addNodes: function (nodes) { 
      mNodesData = mNodesData.concat(nodes); 
     }, 
     addEdges: function (edges) { 
      mEdgesData = mEdgesData.concat(edges); 
     }, 
     draw: function() { 
      mLink = svg.selectAll(".edge") 
       .data(mEdgesData) 
       .enter() 
       .append("line") 
       .attr("class", "edge") 
       .style("stroke", "#ccc") 
       .style("stroke-width", function (e) { 
        return 1 
        /* e.width*/ 
       }); 

      mNode = svg.selectAll(".node") 
       .data(mNodesData) 
       .enter() 
       .append("g") 
       .attr("class", "node") 
       .call(d3.drag() 
        .on("start", dragstarted) 
        .on("drag", dragged) 
        .on("end", dragended)); 

      mNode.on('mouseover', function (d) { 
       function removePopup() { 
        $("#nodePopup").remove(); 
       } 

       function showPopup(d) { 
        removePopup(); 
        if (!d['data']) { 
         return; 
        } 

        var data = d['data']; 
        var htmlStr = ''; 
        htmlStr += '<div id="nodePopup" >'; 
        htmlStr += ' <div><button id="nodePopupCloseButton" type="button" class="close" data-dismiss="alert"><span class="glyphicon glyphicon-remove" style="font-size: 13px;"> </span> </div>'; 
        htmlStr += ' <div class="nodePopupName">' + data['name'] + '</div>'; 
        if (data['desc']) { 
         if (data['desc'].startsWith("http")) { 
          htmlStr += ' <a class="nodePopupLink" href="' + data['desc'] + '" target="_blank">Go to post..</a>'; 
         } 
         else { 
          htmlStr += ' <div class="nodePopupDesc">' + data['desc'] + '</div>'; 
         } 
        } 
        htmlStr += ' <div class="nodePopupGroup">GROUP: ' + data['groupId'] + '</div>'; 
        htmlStr += ' <div class="nodePopupLeader">LEADER: ' + data['leaderId'] + '</div>'; 
        htmlStr += ' <div class="nodePopupImage"><img src="' + d['image'] + '" style="width: 130px;" /></div>'; 
        htmlStr += '</div>'; 

        $("body").append(htmlStr); 
        $("#nodePopupCloseButton").click(removePopup); 
       } 

       showPopup(d); 

       mNode.filter(function (d1) { 
        return (d !== d1 && d1.adjacents.indexOf(d.id) == -1); 
       }).select("image").style("opacity", 0.2); 
       mNode.filter(function (d1) { 
        return (d !== d1 && d1.adjacents.indexOf(d.id) == -1); 
       }).select("circle").style("stroke", "#f6f6f6"); 
       mLink.filter(function (d1) { 
        return (d !== d1.source && d !== d1.target); 
       }).style("opacity", 0.2); 

       mNode.filter(function (d1) { 
        return (d == d1 || d1.adjacents.indexOf(d.id) !== -1); 
       }).select("image").style("opacity", 1); 
       mNode.filter(function (d1) { 
        return (d == d1 || d1.adjacents.indexOf(d.id) !== -1); 
       }).select("circle").style("stroke", "gray"); 
       mLink.filter(function (d1) { 
        return (d == d1.source || d == d1.target); 
       }).style("opacity", 1); 
      }) 
       .on('mouseout', function() { 
        // removePopup(); 
        mNode.select("image").style("opacity", 1); 
        mNode.select("circle").style("stroke", "gray"); 
        mLink.style("opacity", 1); 
       }); 

      var nodeCircle = mNode.append("circle") 
       .attr("r", function (d) { 
        return 0.5 * Math.max(d.width, d.height) 
       }) 
       .attr("stroke", "gray") 
       .attr("stroke-width", "2px") 
       .attr("fill", "white"); 

      var nodeImage = mNode.append("image") 
       .attr("xlink:href", function (d) { 
        return d.image 
       }) 
       .attr("height", function (d) { 
        return d.height + "" 
       }) 
       .attr("width", function (d) { 
        return d.width + "" 
       }) 
       .attr("x", function (d) { 
        return -0.5 * d.width 
       }) 
       .attr("y", function (d) { 
        return -0.5 * d.height 
       }) 
       .attr("clip-path", function (d) { 
        return "circle(" + (0.48 * Math.max(d.width, d.height)) + "px)" 
       }); 


      simulation.nodes(mNodesData); 
      simulation.force(".edge").links(mEdgesData); 

      simulation.on("tick", function() { 
       mLink.attr("x1", function (d) { 
        return d.source.x; 
       }) 
        .attr("y1", function (d) { 
         return d.source.y; 
        }) 
        .attr("x2", function (d) { 
         return d.target.x; 
        }) 
        .attr("y2", function (d) { 
         return d.target.y; 
        }) 

       mNode.attr("transform", function (d) { 
        return "translate(" + d.x + "," + d.y + ")" 
       }); 
       mNode.attr("cx", function (d) { 
        return d.x = Math.max(d.width, Math.min(width - d.width, d.x)); 
       }) 
        .attr("cy", function (d) { 
         return d.y = Math.max(d.height, Math.min(height - heightDelta - d.height, d.y)); 
        }); 
      }); 

      function dragstarted(d) { 
       if (!d3.event.active) simulation.alphaTarget(0.3).restart(); 
       d.fx = d.x; 
       d.fy = d.y; 
      } 

      function dragged(d) { 
       d.fx = d3.event.x; 
       d.fy = d3.event.y; 
      } 

      function dragended(d) { 
       if (!d3.event.active) simulation.alphaTarget(0); 
       d.fx = null; 
       d.fy = null; 
      } 
     } 
    } 
} 

function getData() { 
    return $.ajax({ 
     url: 'api/v1/data.json', 
     type: "GET", 
    }); 
} 

var graph = Graph('d3Graph'); 
graph.init(); 

$.when(getData()).then(function (data) { 
    graph.addNodes(data.nodes); 
    graph.addEdges(data.edges); 
    graph.draw(); 

}); 


function add() { 
    graph.addNodes([{ 
     "id": 4, 
     "image": "images/4.jpeg", 
     "height": 20, 
     "width": 20, 
     "adjacents": [0], 
     "data": { 
      "name": "Number4", 
      "groupId": "Bla4", 
      "desc": "Desc4", 
      "leaderId": "1234-1234" 
     } 
    }]); 
    graph.addEdges([{ 
     "source": 4, 
     "target": 3, 
     "width": 1 
    }]) 
    graph.draw(); 
    // graph.draw(); 
} 

&ノードが追加されます。それをどうやって達成するのですか? (あなたが現在持っているどのようなすべての新しい..

+0

あなたは実際のフィドルを投稿できますか? – Cyril

+0

私はajaxリクエストと静的ファイルでどのようにできるのか分かりません。私はgithubリポジトリへのリンクを追加しました。クローンしてローカルで実行してみてください。私はそれを行う方法を把握しようとします。 – ItayB

+0

ちょっとあなたのサンプルJSONを置くために要点を使用することができます。それからajaxそれ。ここに小さなサンプルがあります。https://www.webpackbin.com/bins/-L0IvrLD7ffULnFx-XAP – Cyril

答えて

0

ソリューションは、両方のリンクに&ノードをmergeを追加することです:。。

mLink = svg.selectAll(".edge") 
       .data(mEdgesData) 
       .enter() 
       .append("line") 
       .attr("class", "edge") 
       .style("stroke", "#ccc") 
       .style("stroke-width", function (e) { 
        return 1 
        /* e.width*/ 
       }).merge(mLink); 

      mNode = svg.selectAll(".node") 
       .data(mNodesData) 
       .enter() 
       .append("g") 
       .attr("class", "node").merge(mNode); 
0

を作成せずに、古いものを更新します。

mLink = svg.selectAll("link") 
      .data(mEdgesData) 
      .enter() 
      .append("line") 

通常selectAll("link")は、あなたがリンクされているすべてのHTML要素を選択することを意味しかし、あなたはlineなくlinkを追加。。したがって、追加要素は、あなたのselectAllの一部ではないあなただけのwanna既に存在する何かにデータを追加することを知っている可能性がない

+0

私はリンクするように行を変えようとしましたが、現在はegdeは表示されず、ノードだけが表示されます。追加しようとする前に、最初の負荷で発生します。 – ItayB

+0

線を描きたい。あなたができることは: 'selectAll("。edge ")'と '.append(" line ")'の後.attr( "class"、 "edge") ' – Wikunia

+0

私はそれをしてやったノードの場合も同じです。新しいリンクを1つだけ追加して新しいノードを追加しましたが、最初の4つのノードが非アクティブになりました(私はもうドラッグできません) – ItayB

関連する問題