【问题标题】:ChartJS re-rendering bugChartJS 重新渲染错误
【发布时间】:2019-11-20 13:30:45
【问题描述】:

所以我正在构建一个交易工具并使用 chartJS 制作图表。这就是我的图表现在在页面上的样子:

所以我的问题是,当我更改图表的时间段时,图表随机显示旧数据与新数据混合。

您可以在此处查看行为:https://gifyu.com/image/vda5

目前我不能在同一页面上同时使用大图表和小图表,因为有计时周期的大图表也有多个 AJAX 调用,所以每次我点击“1W”时,例如,一个新的正在调用并绘制图表。

我尝试过的事情:

我知道对于chartJS中的动态图表我必须销毁图表,所以我正在使用

if (window.chart !== undefined)  window.chart.destroy();

对于小图表,我使用一个空数组并将元素推入其中。这是我的做法:

if ($(quoteDisplayEl).hasClass('quoteDisplay-light')) {
    chartHandel.push(quoteChart);
} else {
    window.chart = quoteChart;
}

因此,对于大图表,我将其分配给全局变量,将小图表分配给空数组 - 这样我可以在一页上拥有多个图表。

但是为了销毁大图表,我应该从头开始销毁并重新渲染所有图表(我猜),我尝试了多种方法来实现这一目标。

不幸的是,代码超过 500 行,并且有大量来自 API 和 DB 的可变数据,因此我无法制作小提琴演示。

【问题讨论】:

    标签: javascript jquery chart.js chart.js2


    【解决方案1】:

    比起chart.destroy(),我更喜欢chart.update()

    Here's a small, simple example how I usually update data.

    1. 我为每个图表制作一个对象,其中包含标签(空数组)和数据(空数组)和颜色以及您需要的所有内容。
    2. 我用我得到的数据 (AJAX) 填充这些数组。
    3. 可选:如果我获取了所有数据并需要对其进行过滤以显示更少的数据,我将复制我的对象以保留我获取的所有数据,并将我现在需要用于图表的所有数据保存在另一个对象中
    4. 创建一个updateChart() 函数,它可以更改您显示的数据或备份对象中保存的数据,或者使用来自新 AJAX 请求的新数据。
    5. 以chart.update() 结束updateChart()(或任何您的图表名称)。

    多个图表应该不是问题,您不必销毁图表。

    【讨论】:

    • 嘿,感谢您的评论,我认为没有人会看))我尝试更新,但没有运气。这就是我更新图表的方式:prnt.sc/pzm3qy,在这里我将图表添加为全局变量或将其添加到数组中:prnt.sc/pzm4gm 但我假设使用您的解决方案我只能对所有图表使用 chartHandel.push,但是,它不起作用,图表仍然重新渲染..
    • 我稍后再看看。但是代码会很有帮助。如果您可以将其发布在某个地方,那就太好了,不需要工作,我可以过滤掉我需要的东西。这可能吗?
    • 当然,我删除了大部分与问题无关的代码,只留下了 Ajax 调用以及图表数据和图形。你可以在这里找到它:pastebin.com/p0Ar0X95 谢谢 :)
    猜你喜欢
    • 1970-01-01
    • 2019-01-03
    • 2020-08-31
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2021-06-20
    • 2014-09-26
    相关资源
    最近更新 更多