2013-05-20 4 views
0

Итак, я хочу рисовать дуги, используя D3 в зависимости от данных. Однако, когда я пытаюсь передать значение как функцию, он терпит неудачу, если я передаю его как переменную, он работает.D3JS не может получить функцию?

Проверьте скрипку: http://jsfiddle.net/paulocoelho/WyABt/1/

И Heres код:

var a = [[0.1, 0.4],[0.4,0.56],[0.56,1]]; 

var cfg = { 
    w:200, 
    h:200 
}; 

var g = d3.select("#testdiv").append("svg").attr("width", cfg.w).attr("height", cfg.h).append("g") 

var arct = d3.svg.arc() 
     .innerRadius(cfg.h/4) 
     .outerRadius(cfg.h/3) 
     .startAngle(0) 
     .endAngle(Math.PI); 

// This one works 
var path = g.selectAll("circleArcs").data(a).enter().append("svg:path") 
    .attr("d", arct) 
    .style("fill","blue") 
    .attr("transform", "translate("+cfg.w/2+","+cfg.h/2+")"); 

// This one does not! 
var path2 = g.selectAll("circleArcs").data(a).enter().append("svg:path") 
    .attr("d", function(d,i){ return arct;}) 
    .style("fill","green"); 

Итак, сейчас данные не зацепили, но моя точка здесь является то, что я передаю точно такой же объект arct но тот, который идет, хотя функция возврата не работает ...

ответ

1

Когда arct используется в первом path, d3-х .attr вызывает arct FUNC Тион.

selection.attr(name[, value]

... если значение является функцией, то функция оценивается [курсив] для каждого выбранного элемента (в порядке) ...

Но в path2, когда arct возвращается внутри внешний функция, .attr работает внешний функция, bu t внутренняя функция arct не будет автоматически вызвана.

Вот пересмотренная скрипку ...

http://jsfiddle.net/pnQKY/2/

var path2 = g.selectAll("circleArcs").data(a).enter().append("svg:path") 
    .attr("d", function(){ 
     // console.log(typeof arct); // "function": returns function reference, which does not get invoked inside of the outer function 
     // console.log(typeof arct()); // "string": returns value of invoked function 
     return arct(); 
    }) 
    .style("fill","green"); 
    ... 

Надеется, что это помогает в качестве отправной точки.

+0

Спасибо, это было :) – PCoelho