快速仅供参考,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数组的方法。此方法将chartDataData数组的第一个元素中的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
,因为无论如何它们都是相同的。随意调整逻辑,如果你想默认其他新图形隐藏或任何。
太棒了。也是彻底的解释。非常感谢!有一个问题,如果我们将'AmCharts.ready'结合到'$(document).ready',我们将如何实现诸如更改amCharts主题之类的东西?例如。通常我们可以使用'AmCharts.theme = AmCharts.themes.patterns;',现在应该放在哪里? – deathlock
'AmCharts'是一个全局变量,因此您可以在图表创建之前的任何位置进行设置。如果要动态更改主题,则必须先清除图表实例并重新创建它们。更改主题将需要访问ready方法之外的图表实例。 – xorspark
请参阅[关于使用主题的本文](https://www.amcharts.com/kbase/working-with-themes/)以及他们的[如何在运行时更改主题]的示例(http:// extra .amcharts.com/tutorials/themes /#) – xorspark