2013-05-11 84 views
0

我有d3(立体派)的代码在CoffeeScript的类中的下列位:d3.js选择和调用()难题

d3.select("view").selectAll(".horizon") 
    .data(@metrics) 
    .enter() 
    .insert("div", ".bottom") 
    .attr("class", "horizon") 
    .call(@ctx.horizon()) 

,一切的伟大工程。不过,我想下面的数据结构传递到类实例化“视图”:

metricGroup = 
    cpu: 
    extent: [0,100] 
    temperature: 
    extent: [0,80] 
    power: 
    scale: d3.scale.ordinal([0,1,2]).range([-2,1,-1]) 
    extent: [-2,1] 

,你可以看到,我想一定scaleextent s到每个指标相关联。每个度量(将)限定到每个horizon对象需要在上述d3代码被链接特定的呼叫,使得:

.call( 
    @ctx.horizon() 
    .scale(@metricGroup.power.scale) 
    .extent(@metricGroup.power.extent) 
) 

所以对于“力量”度量,这将是

.call(
    @ctx.horizon() 
    .scale(d3.scale.ordinal([0,1,2]).range([-2,1,-1])) 
    .extent([-2,1]) 
) 

我怎么能保持选择/输入/调用方法链的优雅,但提供我想要的定制?

+0

您是否尝试过使用缩放等部分数据传入? – 2013-05-11 20:05:27

回答

0

我在这里有点受到限制,因为我对立体主义只有一点熟悉,而且我受不了coffeescript :)。但看起来你可能想要为你的水平线属性定义函数,按照“数组语言”示例here (scroll up one paragraph)。我不知道@metrics在你的代码中,但是如果你使用了一组键名,例如["cpu", "temperature", ...]你可以在函数中查找,例如(对不起,切换到js):

.call(
    ctx.horizon() 
     .scale(function(d) { return metricGroup[d].scale || defaultScale; }) 
     // etc 
)