15

データベースからの現在のデータを使用して新しい配列を生成することにより、Highchart シリーズを更新しようとしています。しかし、何らかの理由で、一度に 1 つずつデータを調べることに関する情報しか見つかりません。チャートが作成されると、同じコードを再度実行するだけで、ラベルなどは変更されず、[pointStart] と [data] のみが変更されます。

すべてのデータをまとめて更新する方法はありますか? また、for ループを正しく動作させることもできませんでした。

function generateSeries(data){
    var cData = [];
    var rollup = data.rollupData;
    cData['type'] = 'line';
    cData['pointStart'] = convertDateTime(data.lastMinute);
    cData['pointInterval'] = 60 * 1000;
    for(var i in rollup){
        var x = new Array();
        var v = rollup[i].rttSystem;
        switch(v){
            case('line'): var vn = ' (L)'; break;
            case('node'): var vn = ' (N)'; break;
            case('module'): var vn = ' (M)'; break;
            default: var vn = '';
        }
        x['name'] = rollup[i].rollupName + vn;
        x['data'] = rollup[i].kpiData;
        cData.push(x);
    }
    return cData;
}

配列の出力は [0: ['name': 'California', 'data': [0.002, 0.003 ...],1: ['name':'Oklahoma', 'data': [0.001, 0.002 ...], 'type': 'line', 'pointStart':'','pointInterval':60 * 1000]

var chart = new Highcharts.Chart({
    chart: {
    ...
    },
    series: generateSeries(data)
    }, function(chart){
        setInterval(function(){
            var newSeries = generateSeries(data);
            // Udate the series again with the current data
        },60000);
    }
});

更新:これはシリーズを行いますが、pointStartは行いません。

if(chart.series.length > 1){
    var s = 0;
    for(var i in newSeries){
        chart.series[s].setData(newSeries[i].data);
        chart.series[s].pointStart = newSeries[i].pointStart;
        s++;
    }
}else{
    chart.series[0].setData(newSeries[0].data);
    chart.series[0].pointStart = newSeries[0].pointStart;
}
4

2 に答える 2

5

私の場合、データが利用可能になる前にチャートを初期化したいと考えています。そのため、チャートを空のシリーズで初期化し、それを で更新しaddSeriesます。

完全な jsFiddle はこちら: https://jsfiddle.net/qyh81spb/

私のチャートは、初期化されてから 2 秒後にデータを受け取ります。

MyChartComponent.initHighcharts();
setTimeout(function() {
  MyChartComponent.setDataFromApi();
  MyChartComponent.updateChart();
}, 2000);

したがって、空のシリーズで初期化します。

initHighcharts: function() {
  this.chart = new Highcharts.Chart({
    chart: {
      type: 'column',
      renderTo: 'container'
    },
    ...
    series: [] // initialisation with empty series. This is intentional
  });
},

そして、データが利用可能になるたびに、私はこれを行います:

updateChart: function() {
  this.dataFromApi.forEach(function(serie) { // for each row of data, add a series
    this.chart.addSeries(serie, false); // false is to prevent redrawing
  }.bind(this));
  this.chart.redraw(); // manually redraw
  this.chart.hideLoading(); // stop loading if showLoading() was call before
},

完全なコードの詳細については、上記の jsfiddle を参照してください。

于 2016-09-06T15:55:41.580 に答える