Schnell FYI, AmCharts.ready
entspricht $(document).ready
, so dass Sie leicht die kombinieren zwei.
Wie bei Ihrer Frage müssen Sie Ihre Daten und Diagrammgenerierung Ansatz optimieren, so dass es die dynamisch hinzugefügten Daten verarbeiten kann. Im Moment ist Ihr Setup in den ersten drei Zeilen ziemlich hart codiert und die neuen Daten werden nie hinzugefügt. Sie müssen außerdem das Diagramm aktualisieren und bei Bedarf weitere Diagramme hinzufügen, wenn neue Zeilen hinzugefügt werden.
Das erste, was ich tat, war Aktualisierung Ihre Daten Methode dynamisch generiert alle Zeilen zu ziehen, die Daten enthalten, anstatt die aktuelle fest codierte Methode, die die ersten drei Reihen packt:
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);
}
}
Als nächstes habe ich ein generateGraphsFromData
Methode, die die Diagramminstanz und das chartData-Array übernimmt. Diese Methode vergleicht die im ersten Element des chartData-Arrays gefundenen valueFields mit den valueFields im Array graphs
des Diagramms und erstellt neue Graphen, in denen keine Arrays vorhanden sind. Dies funktioniert sowohl für die Erstellung von Diagrammen und Update:
//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);
});
}
Von dort habe ich Ihre bereit Methode nur aktualisiert, um diese Funktion aufzurufen, anstatt die graphischen Darstellungen der Einstellung manuell, zusammen mit zwingt die ersten beiden versteckt werden:
// Create graphs
generateGraphsFromData(chart, chartData);
//default the other two graphs to hidden
chart.graphs[1].hidden = true;
chart.graphs[2].hidden = true;
Dann modifiziert ich Ihre Click-Ereignis als auch die generateGraphs Methode aufzurufen:
$(".ganti").click(function(e) {
$('#dataTable').append(newtr, newtr2, newtr3);
generateChartData();
generateGraphsFromData(chart, chartData);
// ...
Updated fiddle. Ich habe auch die AmCharts.ready-Methode in eine separate Standalone-Funktion verschoben und sie in $(document).ready
aufgerufen, da beide sowieso identisch sind. Fühlen Sie sich frei, die Logik zu optimieren, wenn Sie andere neue Graphen auf Versteckt oder was auch immer voreinstellen möchten.
Fantastisch. Genaue Erklärung auch. Danke vielmals! Eine Frage, wenn wir die "AmCharts.ready" mit "$ (document) .ready" kombinieren, wie würden wir Dinge wie das Ändern des amCharts Themes implementieren? Z.B. normalerweise können wir 'AmCharts.theme = AmCharts.themes.patterns;' verwenden, wo sollte es jetzt stehen? – deathlock
'AmCharts' ist eine globale Variable, so dass Sie sie vor dem Erstellen des Diagramms beliebig festlegen können. Wenn Sie ein Thema dynamisch ändern, müssen Sie die Diagramminstanz (en) zuerst löschen und neu erstellen. Das Ändern des Designs würde den Zugriff auf die Diagramminstanzen außerhalb der ready-Methode erfordern. – xorspark
Sehen Sie [diesen Artikel über die Arbeit mit Themen] (https://www.amcharts.com/kbase/working-with-themes/) sowie ihr Beispiel von [Wie man Themen zur Laufzeit ändert] (http: // extra .amcharts.com/tutorials/themes/#) – xorspark