从下拉选项更新的图表

问题描述 投票:2回答:1

我有一个javascript文件app.js和一个php文件data.php

app.js使用来自data.php的JSON输出的数据创建图表。

app.jsbelow:

$(document).ready(function(){

  $.ajax({
    url: "http://localhost/chartjs/data.php",
    method: "GET",
    success: function(data) {
      console.log(data);
      var op1 = [];
      var op2 = [];

      let data_keys = Object.keys(data[0])
      console.log(data_keys)
      first = data_keys[0] //1st element
      second = data_keys[1] //2nd element

       for(var i in data) {
            op1.push(data[i][first])
            op2.push(data[i][second])

               }

      var chartdata = {
        labels: op1,
        datasets : [
          {
            label: 'SystemID and Apparent Power (VA)',
            backgroundColor: 'rgba(250, 50, 50, 0.4)',
            borderColor: 'rgba(500, 50, 50, 0.5)',
            hoverBackgroundColor: 'rgba(500, 30, 30, 0.2)',
            hoverBorderColor: 'rgba(500, 30, 30, 0.3)',
            data: op2
          } 
        ]
      };

      var ctx = document.getElementById('mycanvas').getContext('2d');

      var barGraph = new Chart(ctx, {
        type: 'line',
        data: chartdata,
        options: {
        scales: {
           xAxes: [{
                   ticks: {
                    fontSize: 10
                   }
                  }],
            yAxes: [{
                ticks: {
                    fontSize: 10
                }
            }]
                }
             }
      });
    },
    error: function(data) {
      console.log(data);
    }
  });
});

上面的代码都运行正常,我可以使用来自data.php的查询数据查看图表。

data.php的一部分如下:

$sql = "SELECT SystemID, ApparentPower FROM RaritanMachineDataa";
$result = sqlsrv_query($conn, $sql);
$data = array(); 
while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) {
    $row = preg_replace("/[^0-9]/", "", $row);
    $data[] = $row;
}
sqlsrv_free_stmt($result);
sqlsrv_close($conn);
echo json_encode($data);
?>

现在我想在我的图表下方有一个下拉菜单,我希望能够从任何选项中进行选择,并将这些选项发送到我的data.php SELECT查询并更新图表。我该怎么做呢?

javascript php html mysql chart.js
1个回答
2
投票

你可以使用addDataremoveData,参见https://www.chartjs.org/docs/latest/developers/updates.htmladdData每次调用只添加一个数据集,但removeData会从图表中删除所有数据集。还有推送标签和数据集的方法,请参阅codepen示例:https://codepen.io/jordanwillis/pen/bqaGRR

首先,您需要将图表保存在变量中,以便轻松添加和删除数据。当你在var中保存图表时,让我们说myChart,你可以像removeData()一样调用myChart.removeData()。要添加数据,您必须发送标签和数据,如:myChart.addData('news', [2, 32, 3])

接下来的想法就是在ajax调用成功时更新图表。重要的是在你有ajax调用的同一个文件中有图表实例,你应该调用js文件,或者从àpp.js调用函数。

现在取决于您的数据结构,您需要遍历每个并获取值和标签。您必须从创建图表时的数据中获得相同的结果。

代码示例:

你在app.js会有什么

$(document).ready(function(){

    $.ajax({
        url: "http://localhost/chartjs/data.php",
        method: "GET",
        success: function(data) {
            console.log(data);
            var op1 = [];
            var op2 = [];

            let data_keys = Object.keys(data[0])
            console.log(data_keys)
            first = data_keys[0] //1st element
            second = data_keys[1] //2nd element

            for(var i in data) {
                op1.push(data[i][first])
                op2.push(data[i][second])

            }

         var chartdata = {
         labels: op1,
         datasets : [
             {
             label: 'SystemID and Apparent Power (VA)',
             backgroundColor: 'rgba(250, 50, 50, 0.4)',
             borderColor: 'rgba(500, 50, 50, 0.5)',
             hoverBackgroundColor: 'rgba(500, 30, 30, 0.2)',
             hoverBorderColor: 'rgba(500, 30, 30, 0.3)',
             data: op2
         } 
         ]
  };

  var ctx = document.getElementById('mycanvas').getContext('2d');

  var barGraph = new Chart(ctx, {
    type: 'line',
    data: chartdata,
    options: {
    scales: {
       xAxes: [{
               ticks: {
                fontSize: 10
               }
              }],
        yAxes: [{
            ticks: {
                fontSize: 10
            }
        }]
            }
         }
      });
    },
    error: function(data) {
    console.log(data);
    }
    });

    function updateChartAjaxCall(data1, data2)
    {
        //ajax call here 
        $.ajax({
            type: 'POST',
            url: 'data.php',
            dataType: 'html',
            data: {data1:data1,data2:data2},
            success:function(data){ 
                // here also manipulate data what you get to update chart propertly
                myChart.removeData();
                myChart.addData('newLabel', [23, 33, 4]);
            }, 
            error:function (xhr, ajaxOptions, thrownError){
                console.log(thrownError);
            }, 
            complete: function(){
            }
        });
        e.preventDefault(); 
    }
});

那么你bargraph.html也会改变:

<script type="text/javascript">

$('#submitButton').click(function(e){
    var data1=$("#data1").val();
    var data2=$("#data2").val();

    updateChartAjaxCall(data1, data2);
});
</script>
© www.soinside.com 2019 - 2024. All rights reserved.