javascript - Rita om AmStockChart


Jag har flera AmStockCharts på sidan. De är linjediagram. Data hämtas från MySQL-databasen i JSON-format. Om användaren klickar på en grafpunkt (en punkt) visas ett formulär där användaren kan ändra data och spara det. I det här fallet skulle jag behöva rita om diagrammet och jag kan inte lista ut detta.

Här är kodstycket:

//drawing all charts there are
var chart;
$.getJSON('stats.php', function (data) { // get all data from all stats at once
    var i=0;
    for (chartData in data) {
        i++;
        chart = new AmCharts.AmStockChart();
        var dataSet = new AmChart.DataSet();
        dataSet.dataProvider = chartData;
        // etc. etc. here are all the single graph parameters
        $('#stats').append('<div id="chartdiv' + i + '"></div>');
        chart.write("chartdiv" + i);
    }
});

Jag får alla diagram ritade fint. Men här uppstår då två problem. Det första problemet är att jag inte kan komma åt dem senare eftersom variabeln 'chart' endast refererar till det sista diagrammet som ritades. Det andra problemet är att även om jag försöker rita om det sista diagrammet får jag inget resultat.

För att rita om diagrammet har jag försökt följande:

function chart_redraw(stat) {
    $.getJSON('stat.php?redraw=' + stat, function (data) { // get data for one particular stat
    var dataSet = new AmCharts.DataSet();
    dataSet.dataProvider = data;
    ...
    chart.dataSets = [dataSet];

    var stockPanel = new AmChart.StockPanel();
    stockPanel.validateData();
    chart.panels = [stockPanel];

    chart.validateNow();
});

Det gjorde ingenting, dvs. diagrammet ritas inte om.

Det enda jag kunde göra är att lagra diagrammets div i ett dolt input-fält vid klickhändelsen genom:

function chartClick (event) {
    var chartdiv = event.event.target.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.id
    $('#chart_n').val(chartdiv);
    ...
}

och sedan använda det för att ta bort diagrammet från den div:en och skapa ett nytt där, men det är mycket långsammare än vad validateData() skulle vara.

Svar #1

När data ändras behöver du bara ange ny data för datasettet:

dataSet.dataProvider = yourDataArray;

och sedan ring

stockChart.validateData();

Men din kod borde också ändra panel/dataset, så det är lite konstigt för mig. Får du några fel i konsolen? Om inte, skulle jag behöva se hela fungerande källkoden för ditt fall, men jag hoppas att mitt förslag kommer att fungera.