【问题标题】:Highcharts rendering cycle (numerous label formatter calls)Highcharts 渲染周期(无数标签格式化程序调用)
【发布时间】:2019-12-19 15:08:04
【问题描述】:

tl;包括博士

我有一个yAxis.labels.formatter

/**
 * Formats yAxis labels in order to include the min/max dates of the row
 *
 * /!\ Scared of performance issues
 * /!\ because the formatter is called 4 times on init,
                                       twice on resize, 
                                       and once on update
 * /!\ On top of that, the formatter is called once per category (label)
 * /!\ and my (poopy) function loops over all the data, each time
 * /!\ as a result, we have
 *          => 4 x nbOfCategories x nbOfData
 *  calls of this function :( --> see console logs
 */

如前所述,在初始渲染时,每个类别都会调用格式化程序函数 4 次(并且我当前的实现已经每次循环遍历所有数据,我知道这是一个非常糟糕的主意,但这会改变:见“真正的问题”)。在前两个调用中,this.chart.series[0].data 仍然是空的,但如果我尝试跳过它(通过评论linked demoline 79),那么图表会在没有正确标签格式的情况下实例化(即使我的函数仍然是叫了两次)。 (这已经很奇怪了,不是吗?)

我怀疑 HighCharts 有某种生命周期、顺序,用于绘制/更新导致此问题的图表,但不知道是哪个。

真正的问题

我的真正的问题将是“我应该如何处理这个(格式化轴标签)/是否有更便宜的方法来手动'强制'标签更新?”

我并不完全在寻找优化的功能(但仍然欢迎),因为我已经计划在 HighCharts 之外计算这些标签并将它们作为userOptions 传递,以便将成本从4 x nbOfCategories x nbOfData 降低到只是 4 x nbOfCategories,但理想情况下,我想要一种方法将其减少到 nbOfCategories(就像更新系列数据时只有一个调用一样)。

tl;博士:

有没有办法在初始渲染时使用 HighCharts 的“生命周期”减少标签格式化程序调用的数量(目前为 4 个)?

【问题讨论】:

    标签: javascript highcharts


    【解决方案1】:

    我认为将 yAxisCategoryMinMaxValueFormatter 函数的结果作为 id 附加到数据点并在格式化程序中显示可能是一个更好的解决方案。

    for (let i of data1){
        i.id =  "" + i.name + "<br><b>" + toDdMmDateFormat(new Date(i.start)) + " — " + toDdMmDateFormat(new Date(i.end)) + "</b>"
    }
    

    formatter(){
        let data = this.chart.series[0].userOptions.data;
        return data[this.pos].id
      } 
    

    演示:https://jsfiddle.net/BlackLabel/4h3wqm2u/

    【讨论】:

    • 如果每行有多个任务,这将不起作用。我正在尝试显示整行/行/类别的“总数”(&lt;min date&gt; - &lt;max date&gt;),同时每行有多个任务。在您的演示中,如果您获得同一类别的多个数据,则标签上仅显示第一个数据的id,而不是“总数”。我想我会保留我的解决方案(除非我会对其进行预处理以获得更好的性能)。我似乎也没有找到一种方法来在不完全破坏图表的情况下简单地更新 yLabels...
    • 是的,你是对的。我修改了逻辑。现在它可以在每行有多个任务时工作:jsfiddle.net/BlackLabel/z07ares8
    • (1/2) 啊,是的,我想我会做一些类似的事情(预处理这些极端情况并分配给某处)。对我来说不幸的是,我的数据并不总是按顺序到达,除了每行有多个任务之外,我还使用parent 属性来创建组(层次结构)等......但这很容易管理。我最担心的是yAxis 标签不会在数据更新时更新。您可以尝试您的演示或这个(拖放然后单击更新/重绘按钮,您可能会看到 xLabels 根据宽度而不是 Ys 更新)
    • (2/2) 我打算就这两件事提出另一个 SO 问题:
    • 我认为最好避免混乱,如果关于 SO 的新问题将被打开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2013-04-09
    • 1970-01-01
    相关资源
    最近更新 更多