2014-02-15 1 views
0

D3 및 jquery에 대해 더 자세히 배우려고하므로 실수를 저 지르십시오.토글 노드가있는 D3 트리 레이아웃에서 jsTree 만들기

나는 d3 트리 레이아웃을 확대/축소 트리 레이아웃에 성공적으로 "리믹스"했지만, 사용자가 특정 노드를 켜고 끌 수있는 jstree를 작성하여 세부 사항의 가장 낮은 그레인을 표시하고자합니다. 트리 (현재 클릭 기능은 트리가이 그레인으로 떨어지는 것을 방지합니다). , 내가 JSON "을 구축"할 필요가 나는 toggleNode 기능에 생각에서 그런

function click(d) { 
      if (d.depth != 4) { 
       if (d.children) { 
        d._children = d.children; 
        d.children = null; 
       } else { 
        d.children = d._children; 
        d._children = null; 
       } 
       update(d); 
      } 
      else 
      { 
       var circle = d3.select(this).selectAll("circle"); 
       var togglestate; 
       console.log(circle.style("fill")); 
       if (circle.style("fill") == "#b0c4de") { 
        togglestate="on"; 
        circle.style("fill","red"); 
        toggleNode(togglestate,d); 
       } 
       else { 
        togglestate="off"; 
        circle.style("fill","lightsteelblue"); 
        toggleNode(togglestate,d); 
       } 
      } 
     } 

:

은이 같은 다른 기능에 가장 낮은 수준으로 2 차에 클릭 이벤트를 리디렉션 할 수 있었다 트리를 만들기 위해 jsTree에 전달할 수있는 객체이지만, 이것이 내 이해의 한계를 밀고 있습니다. 누군가 나를 교육시킬 수 있습니까?

나는 완전히 작동하는 바이올렛 here을 만들었습니다.

나는 같은 jsfiddle에 jstree를하는 방법을 잘 모르겠어요,하지만 난 jstree 웹 사이트에서 JSON 형식이 같은 것을 말할 수 있습니다 :

$('#using_json').jstree({ 'core' : { 
    'data' : [ 
     'Simple root node', 
     { 
     'text' : 'Root node 2', 
     'state' : { 
      'opened' : true, 
      'selected' : true 
     }, 
     'children' : [ 
      { 'text' : 'Child 1' }, 
      'Child 2' 
     ] 
     } 
    ] 
} }); 

은 어떻게 든 나는이 두 부분을 접착제 필요 함께. 다시 한 번 결과를 얻을 수있는 더 좋은 방법이 있다고 확신하지만 아직 발견하지 못했습니다.

+0

의 JSON 형식으로 D3 개체를 구문 분석 처리하기 위해이 toggleNode 기능을 썼다 그러나 나는 당신의 질문을 구문 분석하는 어려움을 겪고 있어요. 내 의견으로는 d3과 jquery를 배우기위한 어려운 길을 택 했음에도 불구하고 나무 구조의 구현이 아주 다르다는 사실에도 불구하고이 예제를 보시기 바랍니다 (http://mbostock.github.io/d3/talk/20111018). /tree.html) 여기서 클릭 기능을 사용하면 잎 노드 정보로 추정되는 "가장 세부적인 세부 정보"로가는 것을 막을 수 있습니다. – FernOfTheAndes

+0

@FernOfTheAndes 동의합니다. 이것은 복잡한 질문입니다. ! 그 예가 정확히 같은 생각은 아닙니다. 트리 레이아웃에서 특정 깊이로 멈 춥니 다 (이 예제에서는 4입니다). jstree 객체에 넣고 싶은 수준입니다. 나는 실제로 데이터 객체를 파싱하여 jstree가 트리를 만들 수있는 올바른 형식으로 만들 것이라고 생각한다. – mrkb80

+0

toggleNode 함수에서 내 최근 시도로 my [jsfiddle] (http://jsfiddle.net/bGa48/3/)을 업데이트했습니다. JSON 객체를 콘솔에 씁니다. 그러나이 객체를 jstree의 지정된 형식과 비교하면 정확히 동일하지는 않습니다. jstree 형식으로 정렬하는 방법을 알아 내려고 노력 중입니다. – mrkb80

답변

0

나는 스스로 해결할 수있었습니다. 다음은 최종 솔루션이 포함 된 jsfiddle입니다. 이 일을 처리하는 좀 더 우아한 방법이 있어야합니다.

난 그냥 다른 사람들에 대한하지 확인 jsTree

function toggleNode(togglestate,data) 
    { 
     var cleanchild = new Array(); 
     data._children.forEach(function (d) { cleanchild.push({text: d.name + "-" + d.DET_TYPE + "-" + d.DET_DATE}) }); 
     jtree = { core: { data: [ {text: data.name,children: cleanchild } ] } }; 
     console.log(JSON.stringify(jtree)); 
     //$('#jstree').jstree(jtree); 

    } 
+0

이제 JSON의 권리를 얻었습니까? d3 트리 내부에서 jstree를 어떻게 렌더링 할 계획입니까? 나는 이것이 운동의 전체 범위가 아니라면 결국 당신이 이것을하고 싶다고 가정하고 있습니다 (그것은 비판적이지 않습니다). jstree는 html 요소로 구현 되었기 때문에 svg에 넣을 수있는 유일한 방법은 svg : foreignObject 요소 (IE에서 지원하지 않음) (https : // developer)입니다. 문제가 생길 경우 mozilla.org/en-US/docs/Web/SVG/Element/foreignObject). – FernOfTheAndes

+0

아, 제 질문이 혼란 스럽다는 것을 알 것 같습니다. jsTree는 페이지의 다른 위치에있는 별도의 div에 있습니다. 나는 svg 요소의 click 이벤트를 납치하여 jsTree에 채울 내용을 결정합니다. 진흙으로 생각합니다. jsfiddle을 좀 더 강력하게 만들었지 만, jsTree를 jsFiddle로 훌륭하게 연주하는 데 어려움이있었습니다. 나는 svg와 html을 섞기가 어렵다는 것에 전적으로 동의합니다. – mrkb80