2014-01-25 4 views
0

가 나는 다음과 같은 방법으로 생성 된 SVG 라인의 수백 포함하는 매우 긴 DIV 만드는 오전 SVG로 첨부 : 그러나d3js는 객체가

function visualizeit(ORFdata,max) { 
    var browser = d3.select("#viewer") 
     .append("svg") 
     .attr("width", max/10) 
     .attr("height",'50%'); 

    //Add svg to the svg container 
    for (orf in ORFdata) { 
     var line = browser.append("svg:line"); 
      var object = ORFdata[orf] 
      line.datum(object) 
      line.attr("id", 'mygroup'+orf) 
      line.attr("x1", function(d){ return ORFdata[orf]["start"]/10}) 
      line.attr("x2", function(d){ return ORFdata[orf]["stop"]/10}) 
      line.attr("y1", function(d){ if (ORFdata[orf]["strand"] == "+1") {return 50} else {return 10}}) 
      line.attr("y2", function(d){ if (ORFdata[orf]["strand"] == "+1") {return 50} else {return 10}}) 
      line.style("stroke", "rgb(6,120,155)") 
      line.style("stroke-width", orf) 
      line.on('mouseover', function(d){console.log(d3.select("#mygroup"+orf).datum())}) 
     } 
} 

을, 나는 데이터 만 무엇을 얻을 호선 문제에 마우스 오버를 수행 할 때 마지막 요소에서 다시. 처음에는 'mygroup'때문인 것으로 생각 했으므로 orf에 카운터를 추가했지만 이전 저장된 데이터는 계속 삭제됩니다.

내가 만든 HTML 코드를 보면 svg가 ID에 의해 정확하다고 보입니다. 내가 지금까지 그것을 해결하는 방법

<line id="mygroup50" x1="103356.7" x2="103231.1" y1="10" y2="10" style="stroke: #06789b; stroke-width: 50px;"></line>

그러나 어딘가 링크가 무섭게 잘못

...

...

 var svgContainer = d3.select("body").append("svg") 
          .attr("width", max/10) 
          .attr("height", '50%'); 

    //Add svg to the svg container 
    var lines = svgContainer.selectAll("line") 
     .data(ORFdata) 
     .enter() 
     .append("line") 
     .attr("x1", function(d){ return d.start/10}) 
     .attr("y1", function(d){ if (d.strand == "+1") {return 65} else {return 10}}) 
     .attr("x2", function(d){ return d.stop/10}) 
     .attr("y2", function(d){ if (d.strand == "+1") {return 65} else {return 10}}) 
     .attr("stroke-width","25") 
     .attr("stroke",function(d) {if (d.strand == "+1") {return 'green'} else {return 'red'}}) 
     .on('mouseover', function(d) {console.log(d.start)}) 
} 

답변

2

당신은 루프에서 폐쇄의 무리를 만드는. 각각의 함수는 클로저 범위에 변수 orf을 가지고 있지만 루프는 orf의 값을 변경합니다. 마우스 오버 이벤트가 발생할 때 함수가 실행될 때 orf에는 최종 값이 있으므로 #mygroup + orf 선택은 항상 마지막 요소를 선택합니다.

클로저에 클로저의 함정을 자세히 설명하는 섹션이있는 좋은 페이지는 http://conceptf1.blogspot.ca/2013/11/javascript-closures.html입니다.

D3에서 외부 루프 대신 데이터 조인을 사용하여이 문제를 해결할 수 있습니다. 이 작동 방식을 이해하는 데 도움이되는 유용한 자습서가 있습니다. http://bost.ocks.org/mike/join/

1

는 각 라인 객체에 대한 서로 다른 이벤트 핸들러를 작성해야 , 내가 의미하는 바는 그 라인을 연관된 어레이 나 다른 것들에 저장하는 것이다. 이렇게하면 매번 겹쳐 쓰게됩니다.

당신은 내가 당신을 위해이 이론을 테스트 행복 할 것 jsfiddle 또는 뭔가를 제공 할 수 있다면

...