如何使用HighStock的tickPositioner在月底设置勾号?

时间:2015-05-18 20:40:11

标签: javascript date highcharts stocks

This highcharts admin response解释说这本身不可能:

  

没有选择使用当月的最后日期,但你可以   创建自己的tickPositioner回调

我已经遵循了建议,但无论tickPositioner功能如何,似乎没有任何改变! I've created an isolated demo of the issue here. [只添加了{+ 3}}并添加了定位器。]

在jsFiddle示例中,您可以在下面看到我的tickPositioner。我减去一天(60*60*24*1000)15次(*15)。十五是随机的只是为了表明那里没有影响。

        xAxis:{
            //LOOK HERE!
            tickPositioner:function(){
                return _.forEach(this.tickPositions, function(date){                         
                    console.log('date',date, new Date(date), new Date(date - 60*60*24*1000*15));
                    //return date;   //uncomment to show orginal dates                     
                    return (date - 60*60*24*1000*15);
                });
            //LOOK HERE!
            }
        },

额外说明:

我可以告诉滴答作者正在做某事,因为我可以:

  • 如果功能设置不正确,则完全删除勾号
  • 如果日期不正确,
  • 奇怪地格式化日期
  • 如果一切设置正确,
  • 根本不更改日期标记。

我怀疑日期格式和最小刻度间隔都有变化。在官方的高级字母this example中,我可以看到它有效,但是如果你减少自定义增量,你可以看到一个类似的问题,它对蜱位置没有影响。

1 个答案:

答案 0 :(得分:2)

First and foremost I believe your problem is with the use of forEach of lodash. It doesn't return what you think it returns. From the documentation包裹

  • _.forEach(collection, [iteratee=_.identity], [thisArg])
    
         

    ...

         

    <强>返回

         

    (Array | Object | string):返回collection

    话虽如此,这是在每个月末尝试你的整体问题:

    $('#container').highcharts('StockChart', {
        xAxis:{
            tickPositioner:function(min, max){
                var result = [];
                var current = min;
    
                while(current < max) {
                    var date = new Date(current);
                    var lastDate = new Date(date.getFullYear(), 
                                            date.getMonth() + 1, 
                                            0, 
                                            0, 
                                            -date.getTimezoneOffset());
                    var nextDate = new Date(date.getFullYear(), 
                                            date.getMonth() + 1, 
                                            1, 
                                            0, 
                                            -date.getTimezoneOffset());
    
                    result.push(lastDate.getTime());
                    current = nextDate.getTime();
                }
    
                result.info = this.tickPositions.info;
                return result;
            }
        },
        // ...
    });
    

    请参阅this JSFiddle demonstration的外观。代码可能还有改进的余地。