HighCharts:如何使用reflow在更改大小后允许自动调整大小

Leo*_*ban 5 javascript charts highcharts angularjs highcharts-ng

在我们的Angular应用程序中,我们使用highcarts-ng来实现HighCharts.

这是Chart Maximize和Minimize函数,它的工作原理如下:

function expandChartPanel() {
    vm.chartMaxed = !vm.chartMaxed;

    viewHeader = ScopeFactory.getScope('viewHeader');
    highChart  = ScopeFactory.getScope('highChart');

    var chart = highChart.chartObject;
    var highChartContainer       = document.getElementById("highchart-container");
    var highChartContainerWidth  = document.getElementById('highchart-container').clientWidth;
    var highChartContainerHeight = document.getElementById('highchart-container').clientHeight;

    var windowWidth  = window.innerWidth;
    var windowHeight = window.innerHeight;

    if (vm.chartMaxed) {

        vs.savedWidth  = highChartContainerWidth;
        vs.savedHeight = highChartContainerHeight;

        console.log('savedWidth  = ', vs.savedWidth);
        console.log('savedHeight = ', vs.savedHeight);

        root.chartExpanded          = true;
        viewHeader.vh.chartExpanded = true;
        highChart.highChartMax      = true;

        highChartContainerHeight = document.getElementById('highchart-container').clientHeight;
        windowWidth  = window.innerWidth;
        windowHeight = window.innerHeight;

        highChart.chartConfig.size.width  = windowWidth;
        highChart.chartConfig.size.height = windowHeight - 220;

        chart.setSize(windowWidth, windowHeight - 220);
    }
    else {
        root.chartExpanded          = false;
        viewHeader.vh.chartExpanded = false;
        highChart.highChartMax      = false;

        highChart.chartConfig.size.width  = vs.savedWidth;
        highChart.chartConfig.size.height = vs.savedHeight;

        chart.setSize(vs.savedWidth, vs.savedHeight);
    }

    highChart.restoreChartSize();
}
Run Code Online (Sandbox Code Playgroud)

这是回流功能:

function restoreChartSize() {
    console.log('restoreChartSize');
    if (!vs.chartObject.reflowNow) {
        vs.chartObject.reflowNow = vs.chartObject.reflowNow = function() {
            this.containerHeight = this.options.chart.height || window.window.HighchartsAdapter.adapterRun(this.renderTo, 'height');
            this.containerWidth  = this.options.chart.width  || window.window.HighchartsAdapter.adapterRun(this.renderTo, 'width');
            this.setSize(this.containerWidth, this.containerHeight, true);
            this.hasUserSize = null;
        }
     }

     vs.chartObject.reflowNow();
}
Run Code Online (Sandbox Code Playgroud)

上面的这个回流函数在这个jsFiddle中完美运行,但在我们的应用程序中没有.

我们的HighChartsDirective文件的完整Gist文件.

单击最大化后,图表将扩展到浏览器窗口的完整大小,但在拖动以调整浏览器窗口大小后,我调用该restoreChartSize函数,这将激活重排.

但是,图表的大小不会自动调整为100%100%,它会回到之前的图表大小:(

在最大化之前: 在此输入图像描述

最大化功能后:

在此输入图像描述

现在调整浏览器窗口大小后:

window.onresize = function(event) {
    console.log('window resizing...');
    highChart = ScopeFactory.getScope('highChart');
    highChart.restoreChartSize();
    console.log('highChart.chartConfig = ', highChart.chartConfig);
};
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

^回到较小的静态尺寸,而不是自动尺寸100%

Sha*_*nak 6

您可以通过向图表添加新方法来手动触发重排,如下所示:

chart.reflowNow = function(){
    this.containerHeight = this.options.chart.height || window.window.HighchartsAdapter.adapterRun(this.renderTo, 'height');
    this.containerWidth = this.options.chart.width || window.window.HighchartsAdapter.adapterRun(this.renderTo, 'width');
    this.setSize(this.containerWidth, this.containerHeight, false);
    this.hasUserSize = null;
}
Run Code Online (Sandbox Code Playgroud)

然后,无论何时你想要使用setSize()手动调整大小,只需调用即可 chart.reflow()

这是一个有效的例子:jsFiddle

参考来自:github-issue

ng-highcharts用户的更新

为了在使用ng-highcharts库时执行此操作,您只需在具有highcharts-ng依赖关系的控制器中拉出图表对象并添加该reflowNow函数,如下所示:

var chart = this.chartConfig.getHighcharts();
chart.reflowreflowNow = function (){ ... }
Run Code Online (Sandbox Code Playgroud)

这也是拉出图由NG-highcharts的作者所指出做自定义作业的推荐方式在这里,这小提琴.