【问题标题】:Leaving some iterations of loop when removing yAxis - Highcharts/Angular删除 yAxis 时留下一些循环迭代 - Highcharts/Angular
【发布时间】:2019-12-03 09:57:58
【问题描述】:

我正在尝试从图表中删除数据(yAxis/series),但我不明白为什么我的代码无法正常工作。我正在使用图表将 Observable 数据从父组件发送到子组件。我有 2 个有效或无效的代码。在我看来,使用 remove(true) 同步 forEach 循环存在问题。

我的意思是。当我使用 forEach() 或 for() 循环并尝试删除 yAxis 时,会错过一些循环迭代,并且图表不会删除所有数据。

另一方面,如果我使用 setTimeout() 和 remove(true),问题就解决了,一切都在删除。任何想法是什么问题?

可行的代码:

    this.chart.series.forEach((serie: Highcharts.Series) => {
        if (!this._series.has(serie.options.id)) {
            const yAxis = this.chart.get(serie.options.id) as Highcharts.Axis;
            if (yAxis) {
                 setTimeout(() => {
                     yAxis.remove(true);
                 });
            }
        }
    });

破码:

        this.chart.series.forEach((serie: Highcharts.Series) => {
            if (!this._series.has(serie.options.id)) {
                const yAxis = this.chart.get(serie.options.id) as Highcharts.Axis;
                if (yAxis) {
                    yAxis.remove(true);
                }
            }
        });

第一个工作正常。我正在寻找为什么当我不使用 setTimeout() 时循环的迭代丢失的答案。同步有问题吗?

感谢您的回答。

【问题讨论】:

  • 你能在像代码沙盒这样的在线代码编辑器中重现这个问题吗?您可以将此演示用作模板:codesandbox.io/s/543l0p0qq4.
  • 我不能。我正在使用 NgRx 和真实的 Api 数据。这个项目很大,所以复制它需要很多时间。我知道这会更容易为您展示。我可以告诉你,图表的组件正在从 Store 获取数据,我正在使用 Store 清除它。当我从商店获取系列(@Input())已清除的信息时,图表正在更新。在此更新方法中,我正在检查已保存的图表系列并将其删除,如示例中所示。我已经调试了代码,如果我不使用 setTimeout() 会错过一些迭代。
  • 我认为同步或类似问题存在问题。 remove() 不与循环同步,并且一些迭代比 remove() 操作完成得更快。但我不确定这是否是答案。我正在寻找可能知道为什么会发生这种情况的人:)
  • 另一种好奇心。如果我们用 yAxis.remove(true) 注释该行,则循环正常工作。这看起来 yAxis.remove(true) 操作在这里出现问题。

标签: javascript angular highcharts


【解决方案1】:

这是通过循环从数组中删除元素的经典问题。当您使用带有redraw 参数的remove 方法时,数组将被重新索引。

请查看这个实时示例:http://jsfiddle.net/BlackLabel/fy97u2bv/

解决办法是向后循环:

for (var i = chart.yAxis.length-1; i >= 0; i--) {
    chart.yAxis[i].remove();
}

现场演示: http://jsfiddle.net/BlackLabel/4dt6xjvk/

【讨论】:

  • 我以前试过。有一个小问题。在我生成图表之前,我有一个带有初始 yAxis 的空图表,我的意思是 chart.yAxis.lengt = 1。如果我将删除所有这些图表,它也会删除初始值并会得到“错误类型错误:无法读取属性 'pos'的未定义”。如果我们将删除所有 yAxies(期望初始 yAxis),则可以删除所有系列而不会出现此错误。我的意思是我 > 0;
  • 嗨@Piotr Gudalewicz,我知道您的问题已经解决了吗?通过向后循环,您只能删除特定元素:jsfiddle.net/BlackLabel/ankf6c19
  • 2 个解决方案有效。我只是在寻找答案,remove() 是否可能以某种方式阻塞了 for()/forEach() 循环?在我看来,这是不可能阻止它的。如果我有一个系列 array.length = 2 的数组,那么它应该移动两次,但是如果我使用了 remove() 它只移动了第一次,并且没有检查另一个数组项。 setTimeout() 解决了这个问题,与您的想法相同(如果我将离开第一项)。不明白为什么会阻塞循环的另一次迭代
  • 你说得对。谢谢您的帮助。我们必须反转循环。我已经重新创建了您的代码,它看起来像示例中的:jsfiddle.net/dpu89qgf/4 现在一切正常。感谢您的帮助!
  • remove 方法不会以任何方式阻塞循环。那是正常的同步代码。整个案例是关于重新索引数组。例如,如果您删除索引为 0 的第一项,则第二项将成为第一项并被跳过。 setTimeout 的解决方法有效,因为它是异步代码。请检查此线程:stackoverflow.com/questions/37977602/…
猜你喜欢
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 2014-12-23
  • 2015-12-31
  • 1970-01-01
相关资源
最近更新 更多