Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 删除yAxis时保留一些循环迭代-高图表/角度_Javascript_Angular_Highcharts - Fatal编程技术网

Javascript 删除yAxis时保留一些循环迭代-高图表/角度

Javascript 删除yAxis时保留一些循环迭代-高图表/角度,javascript,angular,highcharts,Javascript,Angular,Highcharts,我试图从图表中删除数据(yAxis/series),但我无法理解为什么我的代码不能正常工作。我用图表将可观察数据从父组件发送到子组件。我有两个代码,它是否有效。在我看来,使用remove(true)同步forEach循环有一个问题 我是说。当我使用forEach()或for()循环并尝试删除yAxis时,循环的某些迭代将丢失,图表不会删除所有数据 另一方面,如果我将setTimeout()与remove(true)一起使用,问题就解决了,所有内容都将被删除。你知道有什么问题吗 可行代码:

我试图从图表中删除数据(yAxis/series),但我无法理解为什么我的代码不能正常工作。我用图表将可观察数据从父组件发送到子组件。我有两个代码,它是否有效。在我看来,使用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()时,为什么循环的迭代会丢失。同步有问题吗


感谢您的回答。

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

请查看此实时示例:

解决方案是向后循环:

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


现场演示:

您能否在codesandbox这样的在线代码编辑器中重现此问题?您可以将此演示用作模板:。我不能。我使用的是NgRx和真实的Api数据。这个项目很大,所以复制它需要很多时间。我知道这会更容易给你看。我可以告诉你,图表的组件正在从存储区获取数据,我正在用存储区清除数据。当我从存储中获取序列(@Input())已清除的信息时,图表正在更新。在这个更新方法中,我检查保存的图表系列,并删除它们,如示例所示。我已经调试了代码,如果我不使用setTimeout(),就会错过一些迭代。在我看来,同步或类似的东西有问题。remove()不与循环同步,某些迭代的速度比remove()操作的速度快。但我不确定这是否是答案。我正在寻找一个可能知道为什么会发生这种情况的人:)另一个好奇。如果我们用yAxis.remove(true)注释该行,则循环工作正常。看起来yAxis.remove(true)操作在这里出了问题。我以前试过。有一个小问题。在生成图表之前,我有一个带有初始yAxis的空图表,我的意思是chart.yAxis.lengt=1。如果我将全部删除,它也将删除initial,并将得到“ERROR TypeError:cannotreadproperty'pos'of undefined”。如果我们删除除初始yAxis之外的所有Yaxie,则可以删除所有序列而不出现此错误。我的意思是I>0;嗨@Piotr Gudalewicz,我知道你的问题已经解决了?通过向后循环,您只能删除特定元素:2个解决方案有效。我只是在寻找答案,remove()是否会以某种方式阻止for()/forEach()循环?在我看来,这是不可能阻止它的。如果我有一个数组series array.length=2,那么它应该移动两次,但是如果我使用了remove(),它只移动了第一次,并且没有检查数组的另一项。setTimeout()解决了这个问题,与您的想法相同(如果我留下第一项)。无法理解为什么可能会阻止另一个循环的迭代,你是对的。谢谢你的帮助。我们必须反向循环。我已经重新创建了您的代码,在示例中是这样的:现在一切正常。谢谢你的帮助!
remove
方法不会以任何方式阻塞循环。这是正常的同步代码。整个案例都是关于重新索引数组的。例如,如果删除索引为0的第一项,则第二项将成为第一项并被跳过。使用
setTimeout
的变通方法之所以有效,是因为它是异步代码。请检查此线程: