6

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

这是图表最大化和最小化功能,它有效:

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();
}

这是回流功能:

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();
}

上面的这个 reflow 函数在这个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);
};

在此处输入图像描述

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

4

2 回答 2

7

您可以通过向图表添加一个新方法来执行此操作,该方法将手动触发回流,如下所示:

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;
}

然后,每当您想摆脱使用 setSize() 手动调整大小时,只需调用chart.reflow()

这是一个工作示例:jsFiddle

参考取自:github-issue

ng-highcharts 用户的更新

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

var chart = this.chartConfig.getHighcharts();
chart.reflowreflowNow = function (){ ... }

这也是 ng-highcharts 的作者拉出图表以执行自定义作业的推荐方法,如here和this fiddle所述。

于 2015-07-31T20:48:03.630 回答
3

我最终找到了一个替代解决方案,这是我唯一可以开始工作的事情,而且实际上它非常简单直接。如果其他人正在寻找解决此问题的方法,这里有一些有用的资源链接,并为我解决了这个问题。

您可以简单地将其添加到图表配置对象中,与 config.series 或 config.options 处于同一级别。评论引用了信息,但对我有用的实际解决方案使用 $timeout 0 秒,here

*用于highcharts-ng明显使用

http://plnkr.co/edit/14x7gfQAlHw12XZVhWm0?p=preview

$scope.chartConfigObject = {

    // function to trigger reflow in bootstrap containers
    // see: http://jsfiddle.net/pgbc988d/ and https://github.com/pablojim/highcharts-ng/issues/211
    func: function(chart) {
        $timeout(function() {
            chart.reflow();
            //The below is an event that will trigger all instances of charts to reflow
            //$scope.$broadcast('highchartsng.reflow');
        }, 0);
    }
};
于 2016-03-10T18:38:55.010 回答