我正在尝试通过使用数据库中的当前数据生成新数组来更新Highchart系列。但出于某种原因,我只能找到一次一个地浏览数据的信息。创建图表后,它只会再次重新运行相同的代码,因此标签等不会更改 - 只有[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;
}
答案 0 :(得分:22)
要更新图表,我通常会这样做:
chart.series[0].update({
pointStart: newSeries[0].pointStart,
data: newSeries[0].data
}, true); //true / false to redraw
尝试在更新后调用重绘。
答案 1 :(得分: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以获取完整的代码详细信息。