【问题标题】:HighCharts Export Breaks After Resetting Chart Options重置图表选项后 HighCharts 导出中断
【发布时间】:2013-09-24 19:28:05
【问题描述】:

在初始加载页面时,我们设置图表选项并创建图表。我们允许用户操作显示/隐藏哪些系列项目,还可以更改每个系列的类型。我们还有一个“重置图表”操作,可以将图表恢复到其原始加载设置。一旦用户重置图表,对图表所做的任何更改都不会反映在导出的图像上,除非用户更改了他们的系列图表类型。一个示例 jsFiddle 是 here,它演示了这个问题。

图表加载后,单击导出类型,您会看到它们匹配。现在从图例中取消选择其中一个系列并再次导出 - 请注意导出和页面仍然匹配。现在从下拉列表中选择“单个系列”并导出 - 它们再次匹配。现在单击重置图表或从下拉列表中选择“多系列”。这会使图表恢复到最初加载时的样子。现在取消选择一个系列并导出 - 它们不再匹配。导出的图像仍然选择了所有系列。现在再次选择“单个系列”并将类型更改为“线”并导出 - 再次显示所有系列,但它们都是线型。

这就是我在“重置图表”点击操作中重置图表的方式:

   //reset Main Chart chart to original specs
    resetMainChart.live('click', function () {
        forceResetChart(chartMainLoc);
    });
...
function forceResetChart(chart) {
    if (mainGraphMode.is(':visible')) {
        if (mainGraphMode.val() == 'multiple') {
            //if (mainGraphFormatType.val() != 'null') {
            //    mainGraphFormatType.val('null');
            //}
            mainGraphFormatType.val('null');
        } else {
            mainGraphMode.val('multiple');
            mainGraphFormatType.val('null');
        }
        mainGraphFormatType.hide();
        mainGraphFormatDefault.show();
    } else {
        mainGraphFormatType.val('null');
    }
    $('#chartMain').highcharts().destroy();
    chartMainLoc = new Highcharts.Chart(optionsChartMain, highlightSer);
}

我不知道为什么以这种方式重置图表会破坏导出。我已经阅读了对其他问题的一些回复,指出我们应该获取当前显示图表的 SVG 并将其发送到导出方法。我不知道该怎么做。文档指出 getSVG() 方法获取 最初 加载图表的 SVG 字符串 - 而不是活动图表。

【问题讨论】:

    标签: javascript jquery highcharts highstock


    【解决方案1】:

    嗯,没有错,它完全按照你写的那样工作。考虑一下:

    chartMainLoc = new Highcharts.Chart(optionsChartMain, highlightSer);
    

    highlightSer 中,您正在显示所有系列。导出图表时,从头开始创建图表,并再次使用回调,因此所有系列都可见。去掉highlightSer回调,你就会看到区别了。

    【讨论】:

    • 好的,但是我正在更改图表上的内容 - 显示的系列等。为什么在初始加载时我可以按照我认为合适的方式操作图表但是如果我将图表重置为初始加载设置和操作图表导出选项没有“看到”更新的图表?如果我删除 highlightSer 回调,那么也只会显示我从单个系列视图中选择的系列 - 即使 optionsChartMain 表示所有系列 visible: true。我被困在 2 个错误/失败之间。
    • 使用jQuery.extend(true, {}, options); 仅对图表使用副本,而不是选项本身。见:jsfiddle.net/FfzaH/4
    • 好吧,这似乎可以解决问题。不过,这到底是在做什么?
    • 如果您使用series.update()添加点、修改颜色或其他一些更改,您将获得相同的效果(只要您使用对象,而不是复制)。在重新创建用于导出的图表后调用回调 - 因此它会覆盖系列可见性。例如,如果您将在该回调中添加 AJAX 调用,则在导出的图表上您将获得两个系列。
    • 是的,确实如此。 chart.exportChart() 使用 getSVG() 从初始选项创建图表的副本,并与实时完成的更改合并。之后,再次调用回调。当您想在图表上添加自定义绘图并希望将它们导出时,它非常有用。
    猜你喜欢
    • 1970-01-01
    • 2020-06-29
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    相关资源
    最近更新 更多