2014-02-26 122 views
0

是否可以调用d3.svg.axis()属性和(如果没有返回)仍然有D3设置默认值?举例来说,如果我有打勾值,然后将它们,否则不:默认勾选设置d3

var x = d3.scale.linear().range([0,440]).domain([0,10]) 
var svg = d3.select('body').append('svg').attr('width', 400) 
var ticks = [1,8] 
var axis = d3.svg.axis() 
    .scale(x) 
    .orient('bottom') 
    .tickValues(function() { 
     if(typeof(ticks=='object')) {return ticks} 
     else {return this} 
     // also tried: 
     else {return} 
     else {} 
    }) 

这将是巨大调用.tickValues()函数,但如果在情况下,我没有蜱对象,有D3设置默认值。这里是一个js小提琴来测试解决方案:http://jsfiddle.net/sWQUu/

回答

3

如果您将null传递给tickValues函数 - 您将获得默认行为。

var axis = d3.svg.axis() 
    .scale(x) 
    .orient('bottom') 
    .tickValues(
     ((typeof ticks) == 'object') ? 
      ticks : 
      null 
    ); 

http://jsfiddle.net/sWQUu/2/

然而,这似乎并没有,如果你给一个函数作为参数传递给.tickValues工作,函数返回null:

var axis = d3.svg.axis() 
    .scale(x) 
    .orient('bottom') 
    .tickValues(function() { 
     return ((typeof ticks) == 'object') ? 
      ticks : 
      null //causes an error 
    }); 

http://jsfiddle.net/sWQUu/3/

如果您需要使用函数,因为您希望每次调用轴时都检查明确的刻度值,您可以从规模抢默认刻度值:

var axis = d3.svg.axis() 
    .scale(x) 
    .orient('bottom') 
    .tickValues(function() { 
     return ((typeof ticks) == 'object') ? 
      ticks : 
      x.ticks() 
    }); 

http://jsfiddle.net/sWQUu/4/

或者,更灵活:

var axis = d3.svg.axis() 
    .scale(x) 
    .orient('bottom') 
    .ticks(5) 
    .tickValues(function() { 
     return ((typeof ticks) == 'object') ? 
      ticks : 
      x.ticks.apply(x, axis.ticks()); 
    }); 

http://jsfiddle.net/sWQUu/5/

axis.ticks()呼叫抓住任何蜱相关的参数已在轴上指定,在本例中为数字5,并将它们作为参数传递给比例的.ticks()方法。您必须使用function.apply才能工作,因为axis.ticks()返回一个参数数组,而不仅仅是一个值(以允许在指定您想要的类型的刻度时使用多个参数的日期时间刻度)。

唯一的问题是我通过变量名引用了比例和轴,而不是它们与轴对象的关联,所以如果在此函数中更改xaxis的含义,将使用新值而不是与此特定轴功能相关的值。 (你不能在轴上引用它们作为this,因为d3的内部工作原理意味着这个函数被调用时,d3选择了<g>元素作为this上下文。)我想不出这可能是一个问题,但无论如何要注意。

+0

非常感谢您的广泛解释 – mike