快速僅供參考,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