【问题标题】:Chart to update from a drop down selection要从下拉选择中更新的图表
【发布时间】:2019-07-19 23:24:43
【问题描述】:

我有一个 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】:

    您可以使用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 调用的同一文件中拥有图表实例,您应该将 onclick 调用移至 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>
    

    【讨论】:

    • 好的嗯,基于我现在的代码。在我的app.js 文件中,我能否以某种方式使用 ajax 从bargraph.html 获取值“data1”和“data2”。如果是这样,你能告诉我如何
    • 好吧,我想您已经将app.js 包含到bargraph.html 中?如果是,那么您可以在此文件中访问所有 html 元素。您可以以相同的方式从元素中获取值,或者您可以在app.js 中添加新函数,您将从bargraph.html 在提交按钮的onclick 事件中调用该函数,结束将选定值作为参数发送到app.js 中运行。我还可以使用示例代码编辑答案。
    • 是的,如果您可以使用示例代码编辑答案将对我有所帮助。谢谢
    • 我们可以聊聊吗
    • 抱歉,现在无法聊天。在这里写下评论问题或用一般问题更新您的问题,您想知道什么,我将为您解释所有内容。
    猜你喜欢
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多