在钻取时重置yAxis Min和Max

时间:2018-05-17 19:26:43

标签: highcharts

我见过类似的问题(即使标题相似),但没有一个能提供我需要的答案。

我有一个bar-negative-stack图表,其中包含明细。 为了保持Y轴居中,我正在计算系列中的最大值并将其设置为图表的极值。

事情是我没有找到一个放置这个逻辑的好地方。我已尝试将其置于redrawrender个事件上,但由于我正在更改yAxis,因此会导致堆栈溢出。 到目前为止我所做的或多或少有效的是设置drilldown事件并使用setTimeout来延迟计算,否则它将在下钻前得到值。我需要一些像drilldownFinish这样的活动。

这是一个关于这个向下钻取逻辑的工作小提琴(虽然不在负条形堆栈上):http://jsfiddle.net/6qpq78do/

关于如何在没有setTimeout的情况下执行此操作的任何想法?

谢谢

1 个答案:

答案 0 :(得分:0)

最大callstack超出消息是由setExtremes函数引起的。它的第三个参数是redraw - 默认为truehttps://api.highcharts.com/class-reference/Highcharts.Axis#setExtremes

因此setExtremes会再次调用redraw事件,redraw事件会调用setExtremes,依此类推......

此处的解决方案是创建一个标志(redrawEnbaled),该标志将控制对redrawEvent中放置的逻辑的访问并阻止此无限递归循环:< / p>

var redrawEnabled = true;
(...)
events: {
  redraw: function() {

    if (redrawEnabled) {
      redrawEnabled = false;
      let values = [];

      this.series.forEach(s => {
        s.yData.forEach(v => values.push(Math.abs(v)));
      });
      let max = values.reduce((acc, val) => (acc > val) ? acc : val, 0);

      this.yAxis[0].setExtremes(-max, max);

      redrawEnabled = true;
    }

  }
}

现场演示: http://jsfiddle.net/BlackLabel/zjuy21k5/