2012-11-28 3 views
-2

D3의 힘 그래프를 사용하여 데이터 기반 디스플레이를 만들고 있습니다.서버 제공 JSON을 통한 Javascript의 기능

나는 ajax를 통해 서버 데이터에서 노드와 링크를 제공한다.

D3 Force Layout 모델에는 기능을 통해 링크 거리를 설정할 수있는 기능이 있습니다. 이 함수를 데이터베이스에 저장하거나 서버 측에서 생성해야합니다.

다음은 간단한 예입니다.

 force 
      .gravity(json_data.gravity || 0.15) 
      .charge(-150 + json_data.nodes.length) 
      .nodes(json_data.nodes) 
      .links(json_data.links) 
      .linkDistance(function (link, index) { 
       if (index % 2) 
        return 30; 
       return 50; 
      }) 
      .start(); 

charge 및 linkDistance와 같은 필드의 경우 서버 측에서 완료해야합니다.

이것을 달성하는 가장 좋은 방법은 무엇입니까? Eval이 해결할 수있는 부분이 있다는 것을 이해하지만 대부분의 소식은 피하지 말라고 말합니다 ..

생각 하시겠습니까?

편집 :

이 내가

"function (link, index) { if (index % 2) return 30; return 50;" 

"function (link, index) { if (index % 3 ==1) return 30; if (index % 3==2) return 40; return 50;" 

를 저장하려고 무엇을 내가 그것을했다 어디 여기.

서버 측 :

public JsonGraphDTO(int Id, UnitRepository repository) { 
     gravity = 0.15; 
     linkDistance = "return 40;"; 
     ... 

클라이언트 측의 처리 :

당신은 다른 기능에 링크 할 수 있도록하려면
 var fn = new Function('lnk','index',json_data.linkDistance); 
     force 
      .gravity(json_data.gravity || 0.15) 
      .charge(-150 + json_data.nodes.length) 
      .nodes(json_data.nodes) 
      .links(json_data.links) 
      .linkDistance(fn) 
      .start(); 
+0

'eval'은 서버 측에서 어떻게 도움이 될까요? – epascarello

+2

통찰력이 있습니까? 2 주 전에 javascript를 배웠는지 모르겠다. 나는 eval을 사용하여 서버에서받은 함수 본문을 실행 가능 함수로 컴파일 할 수 있다고 생각하고 있습니까? –

+0

그래서 JavaScript 함수는 데이터베이스에 JavaScript로 저장되고 서버에서 평가되며 JSON의 일부로 브라우저에 계산 된 값으로 반환됩니까? –

답변

0

, 그 이름을 지정합니다.

function linkDistance1 (link, index) { if (index % 2) return 30; return 50; } 
function linkDistance2 (link, index) { if (index % 3 ==1) return 30; if (index % 3==2) return 40; return 50; } 

그들을

force 
     .gravity(json_data.gravity || 0.15) 
     .charge(-150 + json_data.nodes.length) 
     .nodes(json_data.nodes) 
     .links(json_data.links) 
     .linkDistance(linkDistance1) 
     .start(); 

당신은 배열

var linkDistanceFunctions = [ 
    function (link, index) { if (index % 2) return 30; return 50; }, 
    function (link, index) { if (index % 3 ==1) return 30; if (index % 3==2) return 40; return 50; } 
]; 

또는 객체

var linkDistanceFunctions = { 
    "foo" : function (link, index) { if (index % 2) return 30; return 50; }, 
    "bar" : function (link, index) { if (index % 3 ==1) return 30; if (index % 3==2) return 40; return 50; } 
}; 

로 할 수 참조 당신은 당신이 동적으로로드 할 말했다 스크립트 태그를 통해로드하십시오.

window["myCallBack"] = function(myArrayOfFunctions){ 
    console.log(myArrayOfFunctions); 
}; 
var head= document.getElementsByTagName('head')[0]; 
var script= document.createElement('script'); 
script.type= 'text/javascript'; 
script.src= 'myServerSidePage.php?callback=myCallBack'; 
head.appendChild(script); 

그리고 서버에 당신은 다시 내가 배열을 사용하여 다시 호출

myCallBack([ 
    function (link, index) { if (index % 2) return 30; return 50; }, 
    function (link, index) { if (index % 3 ==1) return 30; if (index % 3==2) return 40; return 50; } 
]); 

와 기능을 반환 당신이 원한다면, 당신은 객체하거나 기능을 다시 보낼 수 있습니다.

+0

이 함수의 생성을 서버로 옮기고 JSON을 통해 푸시 할 수 있습니까? 서버에서 사용할 수있는 데이터가 더 많아서 클라이언트로 전송하지 않을 것입니다. 이러한 기능은 명 시적이며 설명 목적으로 만 사용됩니다. –

+0

JSON이 함수를 지원하지 않기 때문에 JSON이 될 수없는 경우. 당신이 그것을 치부하고 싶다면 그것은 계속됩니다. 스크립트 요청으로 처리하는 것이 더 나을 수도 있습니다. – epascarello

+0

나는 이것이 Eval 거래의 핵심이라고 생각한다. json 문자열을 실행 가능 함수로 변환하는 데 사용할 수 없습니까? –

관련 문제