2017-06-20 25 views
2

你好:)(我是新手,我在工作中学习),chart.js之jQuery的下拉列表中选择的值

我chart.js之,jQuery的,PostgreSQL的

工作

目前,我有一个条形图直接链接到PostgreSQL数据库。

我想添加一个下拉列表,让用户选择一个“区域”,这将动态更新图表。

每个 “区” 有不同的变量:人口,工资(英文雇员人数)等

这里是PHP

<?php 

$dbconn = pg_connect("") 
or die('Erreur de connexion'.pg_last_error()); 

$query = "SELECT id, zone_nom, zone_pop, zone_salaries FROM table"; 
$result = pg_query($query) or die('Query failed: ' . pg_last_error()); 

$array = array(); 
while ($row = pg_fetch_array($result, null, PGSQL_ASSOC)) { 
    $array[] = $row; 
} 

$data=json_encode($array); 
echo $data; 

pg_free_result($result); 

pg_close($dbconn); 

?> 

我得到以下阵列

[{"id":"1","zone_nom":"test ","zone_pop":"36105","zone_salaries":"15279"},{...],{...}] 

然后我生成一个由我的表动态填充的下拉列表

但是我卡在如何通过所选择的值在图表中(并确保图表得到更新取决于选择在下拉菜单中)

<html> 
<head> 
    <title>Liste déroulante dynamique</title> 
    <script type="text/javascript" src="js/jquery.min.js"></script> 
    <script type="text/javascript" src="js/Chart.min.js"></script> 
    <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet/v1.0.3/leaflet.css" /> 
    <script src="http://cdn.leafletjs.com/leaflet/v1.0.3/leaflet-src.js"></script> 
    <script type="text/javascript"> 
     function Zone() { 
      $('#zone-select').empty(); 
      $('#zone-select').append("<option>Chargement</option>"); 
      $.ajax({ 
       type: "POST", 
       url: "http://localhost/data.php", 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       success: function(data){ 
        $('#zone-select').empty(); 
        $('#zone-select').append("<option value='0'>-- Select zone --</option>"); 
        $.each(data,function(i, item){ 
         $('#zone-select').append('<option value='+data[i].zone_pop+'>'+data[i].zone_nom+'</option>'); 
        }); 

        $("#zone-select").change(function(){ 
         var value = $("#zone-select option:selected").val(); // Value of selected option 
         console.log('Value: '+value); 
        }); 

      // How to link the dropdown and the chart ?   

      var zoneNom = []; 
      var zonePop = []; 
      for(var i in data) { 
       zoneNom.push(data[i].zone_nom); 
       zonePop.push(data[i].zone_pop); 
       zoneSalaries.push(data[i].zone_salaries) 
      } 
      var chartdata = { 
       labels: zoneNom, 
       datasets : [ 
        { 
         label: 'Population', 
         backgroundColor: 'rgba(200, 200, 200, 0.75)', 
         borderColor: 'rgba(200, 200, 200, 0.75)', 
         hoverBackgroundColor: 'rgba(200, 200, 200, 1)', 
         hoverBorderColor: 'rgba(200, 200, 200, 1)', 
         data: zonePop 
        }, 
        { 
         label: 'Salaries', 
         backgroundColor: 'rgba(200, 200, 200, 0.75)', 
         borderColor: 'rgba(200, 200, 200, 0.75)', 
         hoverBackgroundColor: 'rgba(200, 200, 200, 1)', 
         hoverBorderColor: 'rgba(200, 200, 200, 1)', 
         data: zoneSalaries 
        } 
       ] 
      }; 

      var option = {}; 
      var ctx = $("#mycanvas"); 
      var barGraph = new Chart(ctx, { 
       type: 'bar', 
       data: chartdata, 
       options: option 
      }); 
        var myBarChart; 

       }, 
       complete: function(){ 
       } 
      }); 
     } 
     $(document).ready(function(){ 
      Zone(); 
     }); 

    </script> 
</head> 
<body> 
    <select id="zone-select"></select> 
    <div id="chart-container"> 
      <canvas id="mycanvas"></canvas> 
    </div> 
</body> 
</html> 

返回选择的值

$("#zone-select").change(function(){ 
    var value = $("#zone-select option:selected").val(); // Value of selected option 
    console.log('Value: '+value); 
}); 

我找的,但我找不到现在的解决方案(可能不是很复杂)

预先感谢您的帮助

+0

我理解你之后的大部分内容,但不清楚如何根据所选下拉值更改图表的渲染方式。您能否在图表代码中显示您希望基于此选择过滤数据的方式? – mjw

回答

2

你可以完成ŧ他使用的变化事件处理函数下面为您的下拉菜单...

,如果你想选择在默认情况下,使用第一个选项...

$("#zone-select").val(zonePop[0]).trigger('change'); 

工作示例

function Zone() { 
 
    $('#zone-select').empty(); 
 
    $('#zone-select').append("<option>Chargement</option>"); 
 
    $.ajax({ 
 
     type: "GET", 
 
     url: "https://istack.000webhostapp.com/json/t9.json", 
 
     dataType: "json", 
 
     success: function(data) { 
 
     //console.log(data) 
 
     $('#zone-select').empty(); 
 
     $('#zone-select').append("<option value='0'>-- Select zone --</option>"); 
 
     $.each(data, function(i, item) { 
 
      $('#zone-select').append('<option value=' + data[i].zone_pop + '>' + data[i].zone_nom + '</option>'); 
 
     }); 
 

 
     $("#zone-select").change(function() { 
 
      var nom = $("#zone-select option:selected").text(); // name of selected option 
 
      var index = zoneNom.indexOf(nom); 
 
      var new_labels = [zoneNom[index]]; 
 
      var new_data1 = [zonePop[index]]; 
 
      var new_data2 = [zoneSalaries[index]]; 
 
      barGraph.data.labels = new_labels; 
 
      barGraph.data.datasets[0].data = new_data1; 
 
      barGraph.data.datasets[1].data = new_data2; 
 
      barGraph.update(); // update chart 
 
     }); 
 

 
     var zoneNom = []; 
 
     var zonePop = []; 
 
     var zoneSalaries = []; 
 
     for (var i in data) { 
 
      zoneNom.push(data[i].zone_nom); 
 
      zonePop.push(data[i].zone_pop); 
 
      zoneSalaries.push(data[i].zone_salaries) 
 
     } 
 
     var chartdata = { 
 
      labels: zoneNom, 
 
      datasets: [{ 
 
       label: 'Population', 
 
       backgroundColor: 'rgba(200, 200, 200, 0.75)', 
 
       borderColor: 'rgba(200, 200, 200, 0.75)', 
 
       hoverBackgroundColor: 'rgba(200, 200, 200, 1)', 
 
       hoverBorderColor: 'rgba(200, 200, 200, 1)', 
 
       data: zonePop 
 
      }, { 
 
       label: 'Salaries', 
 
       backgroundColor: 'rgba(200, 200, 200, 0.75)', 
 
       borderColor: 'rgba(200, 200, 200, 0.75)', 
 
       hoverBackgroundColor: 'rgba(200, 200, 200, 1)', 
 
       hoverBorderColor: 'rgba(200, 200, 200, 1)', 
 
       data: zoneSalaries 
 
      }] 
 
     }; 
 

 
     var option = { 
 
      scales: { 
 
       yAxes: [{ 
 
        ticks: { 
 
        beginAtZero: true 
 
        } 
 
       }] 
 
      } 
 
     }; 
 
     var ctx = $("#mycanvas"); 
 
     var barGraph = new Chart(ctx, { 
 
      type: 'bar', 
 
      data: chartdata, 
 
      options: option 
 
     }); 
 
     var myBarChart; 
 

 
     $("#zone-select").val(zonePop[0]).trigger('change'); // select first option 
 

 
     }, 
 
     complete: function() {} 
 
    }); 
 
} 
 
$(document).ready(function() { 
 
    Zone(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.min.js"></script> 
 
<select id="zone-select"></select> 
 
<div id="chart-container"> 
 
    <canvas id="mycanvas"></canvas> 
 
</div>

+1

是的它的工作原理,再次感谢! 我将在其他图表上剖析并测试此方法 – RemiF