如果您将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()
返回一个参数数组,而不仅仅是一个值(以允许在指定您想要的类型的刻度时使用多个参数的日期时间刻度)。
唯一的问题是我通过变量名引用了比例和轴,而不是它们与轴对象的关联,所以如果在此函数中更改x
或axis
的含义,将使用新值而不是与此特定轴功能相关的值。 (你不能在轴上引用它们作为this
,因为d3的内部工作原理意味着这个函数被调用时,d3选择了<g>
元素作为this
上下文。)我想不出这可能是一个问题,但无论如何要注意。
非常感谢您的广泛解释 – mike