【问题标题】:Asynchronous data input in highchartshighcharts中的异步数据输入
【发布时间】:2016-11-05 15:42:06
【问题描述】:

我正在使用 $.getJSON 方法从 MySQL 数据库加载数据。然后所有数据都显示在高图表中。用户可以单击不同的按钮以在数据集之间进行更改。我的问题是,第一次加载页面时,图表总是加载为空。我发现这可能是因为我用于检索数据的 $.getJSON 方法是异步的。我不确定这是否可以通过将 getJSON 方法切换为 AJAX 方法来解决。我试过但没有成功。或者是否是我的javascript函数在按钮点击时切换图表数据是问题所在。以下是所有代码。我认为导致该问题的代码片段如下所示。我知道你可能想要一个 JSFiddle,但由于我使用的是数据库数据,我现在知道如何正确显示问题。

<script>
  var d = new Date();
  var pointStart = d.getTime();
  //-------------------------------------------------------
  //set a 'line' marker type for use in bullet charts 
  Highcharts.Renderer.prototype.symbols.vline = function(x, y, width, height) {
    return ['M', x, y + width / 2, 'L', x + height, y + width / 2];
  };
  Highcharts.Renderer.prototype.symbols.hline = function(x, y, width, height) {
    return ['M', x, y + height / 2, 'L', x + width, y + width / 2];
  };
  //-------------------------------------------------------
  Highcharts.setOptions({
    global: {
      useUTC: false
    },
    colors: [
      'rgba( 253, 99,  0,   0.9 )', //bright orange
      'rgba( 40,  40,  56,  0.9 )', //dark
      'rgba( 253, 0,   154, 0.9 )', //bright pink
      'rgba( 154, 253, 0,   0.9 )', //bright green
      'rgba( 145, 44,  138, 0.9 )', //mid purple
      'rgba( 45,  47,  238, 0.9 )', //mid blue
      'rgba( 177, 69,  0,   0.9 )', //dark orange
      'rgba( 140, 140, 156, 0.9 )', //mid
      'rgba( 238, 46,  47,  0.9 )', //mid red
      'rgba( 44,  145, 51,  0.9 )', //mid green
      'rgba( 103, 16,  192, 0.9 )' //dark purple
    ],
    chart: {
      alignTicks: false,
      type: '',
      margin: [70, 100, 70, 90],
      //borderRadius:10,
      //borderWidth:1,
      //borderColor:'rgba(156,156,156,.25)',
      //backgroundColor:'rgba(204,204,204,.25)',
      //plotBackgroundColor:'rgba(255,255,255,1)',
      style: {
        fontFamily: 'Abel,serif'
      },
      events: {
        load: function() {
          this.credits.element.onclick = function() {
            window.open(
              ''
            );
          }
        }
      }
    },

  });
</script>



<script>
var chart,
  chartOptions = {},
  chartData = {};


chartOptions.chart1 = {
  chart: {
    type: 'column'
  },
  title: {
    text: '<?php echo $companyName; ?>',
    style: {
      fontSize: '20px'
    }
  },
  subtitle: {
      text: 'Revenues',
      align: 'left',
      x: 55,
      style: {
        fontSize: '16px'
      }
  },
  xAxis: {
    categories: []
  },
  yAxis: {
    title: {
      text: '<?php echo $unitCurr; ?>'
    }
  },
  series: [{
    name: 'Revenues',
    color: '#006699',
    data: []
  }]
};
var tableName = '<?php echo $tableName; ?>'
$.getJSON("../../companies/charts/Data.php", {id: escape(tableName)}, function(json) {
    chartOptions.chart1.xAxis.categories = json[0]['data'];
    chartOptions.chart1.series[0].data = json[1]['data'];
});


chartOptions.chart2 = {
  chart: {
    type: 'column'
  },
  title: {
    text: '<?php echo $companyName; ?>',
    style: {
      fontSize: '20px'
    }
  },
  subtitle: {
      text: 'Earnings before interest and taxes',
      align: 'left',
      x: 55,
      style: {
        fontSize: '16px'
      }
  },
  xAxis: {
    categories: []
  },
  yAxis: {
    title: {
      text: '<?php echo $unitCurr; ?>'
    }
  },
  series: [{
    name: 'EBIT',
    color: '#006699',
    data: []
  }]
};
var tableName = '<?php echo $tableName; ?>'
$.getJSON("../../companies/charts/Data.php", {id: escape(tableName)}, function(json) {
    chartOptions.chart2.xAxis.categories = json[0]['data'];
    chartOptions.chart2.series[0].data = json[4]['data'];
});

$(function() {

    //common options
  Highcharts.setOptions({
    chart: {
      marginRight: 0
    },
    legend: {
      enabled: false
    },
    plotOptions: {
      bar: {
        pointPadding: .01
      },
      column: {
        borderWidth: 0.5
      },
      line: {
        lineWidth: 1
      },
    },
    series: [{
        color: '#027ff7',
    }]
  });
      $('#container').highcharts(chartOptions.chart1);
      chart = $('#container').highcharts();

      $(document).on('click', '.chart-update', function() {
        $('button').removeClass('selected');
            $(this).addClass('selected');
            chart.destroy();
        $('#container').highcharts(chartOptions[$(this).data('chartName')]);
        chart = $('#container').highcharts();
      });
});



</script>
</head>



<body>

    <span class="wrapper">
        <span class="block chart"><div id="container" style="width:400px;height:300px;margin:1.5em 1em;float:left;"></div></span>
        <span class="block buttons">
            <div><button class="chart-update selected" data-chart-name="chart1">CHART1</button></div>
            <div><button class="chart-update" data-chart-name="chart2">CHART2</button></div>

        </span>
    </span>



</body>

</html>

所以具体来说,我想知道以下两个部分是否是导致问题的原因:

var tableName = '<?php echo $tableName; ?>'
$.getJSON("../../companies/charts/Data.php", {id: escape(tableName)}, function(json) {
    chartOptions.chart2.xAxis.categories = json[0]['data'];
    chartOptions.chart2.series[0].data = json[4]['data'];
});

      $('#container').highcharts(chartOptions.chart1);
      chart = $('#container').highcharts();

      $(document).on('click', '.chart-update', function() {
        $('button').removeClass('selected');
            $(this).addClass('selected');
            chart.destroy();
        $('#container').highcharts(chartOptions[$(this).data('chartName')]);
        chart = $('#container').highcharts();
      });

我尝试使用 AJAX 方法来切换 JSON 方法,而不是将 async 设置为 false。如下所示(不起作用,现在即使单击按钮也不会显示任何数据)。

var tableName = '<?php echo $tableName; ?>'
$.ajax({
  url: "../../companies/charts/Data.php",
  data: {id: escape(tableName)},
  dataType: "json",
  async: false,
  succes: function(data) {
  chartOptions.chart1.xAxis.categories = json[0]['data'];
  chartOptions.chart1.series[0].data = json[6]['data'];
  }
});

提前感谢您的帮助!

【问题讨论】:

    标签: javascript json ajax highcharts


    【解决方案1】:

    如果你使用 ajax,我想没有必要将 async 属性设置为 false。此外,似乎您在 ajax 调用上拼错了成功。

    当您的 ajax 调用返回成功时,只需声明所有的 highchart 初始化。所以基本上,在你的 highchart 初始化之上的 ajax 方法。

    【讨论】:

    • 您好,感谢您的评论。我使用 ajax 方法的问题是我无法加载数据。该图表将加载,但我根本无法显示数据并且不明白为什么(即使您指出的成功拼写正确)。关于调用成功返回时声明highchart初始化,我也可以使用JSON方法吗?我可以说服你给我看吗,因为我不知道该怎么做。
    猜你喜欢
    • 2018-12-03
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多