javascript - (amCharts) 图表从 HTML 表获取数据。如果动态添加新的表格行,如何更新图例?

标签 javascript jquery charts amcharts

我有一个 HTML 表,用作图表的数据提供程序。单击按钮即可动态编辑表格(我可以向其中添加新行)。

每次添加新行时我都可以更新图表。然而图例保持不变,它只有三个初始图表。如何更新图表旁边的图例?

这是我的 fiddle :https://jsfiddle.net/yvzj8acd/2/

这是我向表中添加新行的 JS:

          //////////////////////////////////
          // This is where I update the chart
          //////////////////////////////////

          $(document).ready(function() {

          var newtr = "<tr class='row1a'><th>Row 4</th><td>10000</td><td>20000</td><td>5000</td><td>15000</td><td>7500</td><td>10000</td></tr>"
          var newtr2 = "<tr class='row1a'><th>Row 5</th><td>15000</td><td>30000</td><td>2000</td><td>10000</td><td>15500</td><td>7000</td></tr>"
          var newtr3 = "<tr class='row1a'><th>Row 6</th><td>1000</td><td>25000</td><td>15000</td><td>7000</td><td>10000</td><td>8000</td></tr>"

              $(".ganti").click(function(e) {
                $('#dataTable').append(newtr, newtr2, newtr3);

                generateChartData();
                chart.dataProvider = chartData;
                chart.validateData();
                chart.animateAgain();

                e.preventDefault();
              });
          });

最佳答案

仅供引用,AmCharts.ready 相当于 $(document).ready,因此您可以轻松地将两者结合起来。

对于您的问题,您需要调整数据和图表生成方法,以便它可以处理动态添加的数据。现在,您的设置几乎被硬编码到前三行,并且永远不会添加新数据。添加新行时,您还需要更新图表并根据需要添加其他图表。

我做的第一件事是更新生成数据方法以动态提取包含数据的所有行,而不是当前获取前三行的硬编码方法:

function generateChartData() {

  // initialize empty array
  chartData = [];

  // get the table
  var table = document.getElementById('dataTable');

  var years = table.rows[0].getElementsByTagName('th');

    //get the rows with graph values. Since data rows always 
  //have a class that begin with "row", use that as the query selector
  var rows = document.querySelectorAll("tr[class^='row']");

  var row;

  // iterate through the <td> elements of the first row
  // and construct chart data out of other rows as well
  for (var x = 0; x < years.length; x++) {
    //set up the initial object containing the year
    var dataElem = {
      "year": years[x].textContent
    };
    //iterate through the other rows based on the current year column (x + 1) and add that value to the
    //object
    for (row = 0; row < rows.length; row++) {
      dataElem[rows[row].cells[0].textContent] = rows[row].cells[x + 1].textContent
    }
    //append final object to chart data array
    chartData.push(dataElem);
  }
}

接下来,我创建了一个generateGraphsFromData 方法,该方法采用图表实例和chartData 数组。此方法将在图表数据数组的第一个元素中找到的 valueFields 与图表的 graphs 数组中的 valueFields 进行比较,并在数组中没有任何值的情况下创建新的图表。这适用于图表创建和更新:

//update the chart's graphs array based on the the currently known valueFields
function generateGraphsFromData(chart, chartData) {
  //get the chart graph value fields
  var graphValueFields = chart.graphs.map(function(graph) {
    return graph.valueField;
  });
  //create an array of new graph value fields by filtering out the categoryField
  //and the currently known valueFields. 
  var newGraphValueFields = Object.keys(chartData[0]).filter(function(key) {
    return key != chart.categoryField;
  }).filter(function(valueField) {
    return graphValueFields.indexOf(valueField) === -1;
  });

  //for each new value field left over, create a graph object and add to the chart.
  newGraphValueFields.forEach(function(valueField) {
    var graph = new AmCharts.AmGraph();
    graph.title = valueField;
    graph.valueField = valueField;
    graph.balloonText = "Rp[[value]]";
    graph.lineAlpha = 1;
    graph.bullet = "round";
    graph.stackable = false; // disable stacking
    chart.addGraph(graph);
  });
}

从那里我刚刚更新了您的准备方法来调用此函数,而不是手动设置图表,并强制隐藏前两个:

  // Create graphs
  generateGraphsFromData(chart, chartData);

  //default the other two graphs to hidden
  chart.graphs[1].hidden = true;
  chart.graphs[2].hidden = true;

然后我修改了您的点击事件以调用generateGraphs方法:

  $(".ganti").click(function(e) {
    $('#dataTable').append(newtr, newtr2, newtr3);

    generateChartData();
    generateGraphsFromData(chart, chartData);
    // ...

Updated fiddle 。我还将 AmCharts.ready 方法移动到一个单独的独立函数中,并将其调用到 $(document).ready 中,因为无论如何,两者都是相同的。如果您想将其他新图表默认为隐藏或其他任何内容,请随意调整逻辑。

关于javascript - (amCharts) 图表从 HTML 表获取数据。如果动态添加新的表格行,如何更新图例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46787202/

相关文章:

javascript - 如何使用 jstree 删除上下文菜单中的编辑选项?

javascript - 淡入一系列 div 然后淡出前一个

javascript - 根据表单中给出的输入提交表单时在模式框中生成表格

javascript - 我正在尝试使用 CodeMirror 编辑器构建 D3.js,但我在其中输入的任何内容都无法由 D3.js 正确可视化。我缺少什么?

java - 如何通过 "findById"访问 RESTful 服务的 "getJSON"方法?

javascript - 使用 forEach 和 async/await,对于 Node 和 Jest 的行为不同

javascript - 两段 jQuery 代码,但只执行了一段

charts - 谷歌散点图,不同点大小

javascript - 如何实时绘制具有静态范围的心电波?

javascript - 如何获取导致 JavaScript 中抛出 ReferenceError 的变量?