本人由于項目需要,在狀態變化的時候需要動態繪制對應數據的EChart圖表,并且不刷新整個網頁。
所以就用Ajax動態畫EChart圖表,下面是開發過程中遇到的一些坑的總結。
流程:頁面首次加載時展示一幅原始的圖形,若后臺數據更新,則進行一定的業務處理后,前端通過AJAX動態繪制出最新的數據
一、前端JSP代碼
????準備一個放圖表的容器?
????<div id="AScanChart" style="width:50%; height: 60%;float: left;"></div>
????//初始化echarts實例
????var myAScan = echarts.init(document.getElementById('AScanChart'));
????//使用制定的配置項和數據顯示圖表
????myAScan.setOption(aScanOption);
? ? 注:這里省略了原始圖形aScanOption的代碼
? ? 下面是JS代碼
????//定時ajax請求判斷是否有報警
$(document).ready(function() {
setInterval(showAlert, 10000);//每隔10秒調用一次
});
function showAlert() {
var url = "monitorAction_showAlert.action";
var sendData = {
"tempSensorNum" : "${monitor.sensorNum}"
};
//發送post請求
$.post(url, sendData, function(backData, status) {
//window.alert(backData);
//window.alert(status);
var showAlertJsonString = backData.split("&&");
//window.alert(showAlertJsonString[0]);
//將JSON字符串轉出json對象
var showAlertJsonObject = eval("(" + showAlertJsonString[0] + ")");
//window.alert(showAlertJsonObject[0].alertType);
if (showAlertJsonObject[0].alertType == 1) {
$("#blink").html("缺陷報警");
setInterval(changeColor, 250); //設置一個定時器,每200毫秒調用一次變色函數
} else {
$("#blink").html("監測正常");
}
if (showAlertJsonString[1] != ""
&& showAlertJsonObject[0].typeChange == 1) {
var monitorObject = eval("(" + showAlertJsonString[1] + ")");
//window.alert(monitorObject[0].sensorNum);
var xData=eval("(" + monitorObject[0].xDataJson + ")");
var aScanData=eval("(" + monitorObject[0].aScanDataJosn + ")");
var bScanData=eval("(" + monitorObject[0].baseAScanDataJosn + ")");
myAScan.clear();
myAScan.setOption({
title : {
text : 'AScan data'
},
tooltip : {
trigger : 'axis',
axisPointer : {
type : 'cross'
},
},
legend : {
data : [ '用戶來源' ]
},
xAxis : {
name : '距離(m)',
data : xData
},
yAxis : {
name : '(%)'
},
toolbox : {
left : 'center',
feature : {
dataZoom : {
yAxisIndex : 'none'
},
dataView : {
readOnly : false
},
restore : {},
}
},
dataZoom : [ {
type : 'inside'
} ],
series : [ {
name : 'signal',
type : 'line',
data : aScanData
}, {
name : 'baseSignal',
type : 'line',
data : bScanData
} ]
},true);
}
});
}
? ? 注:
????var showAlertJsonObject = eval("(" + showAlertJsonString[0] + ")");
????var xData=eval("(" + monitorObject[0].xDataJson + ")");
????var aScanData=eval("(" + monitorObject[0].aScanDataJosn + ")");????var bScanData=eval("(" + monitorObject[0].baseAScanDataJosn + ")");
? ? 1.這4句代碼是關鍵:由于后端傳過來的是JSON字符串,而ECHart的圖表需要JSON對象,所有首先將JSON字符串轉JSON對象(第一句),這樣還沒完,現在取出的數據還是字符串,需要將對象.對應的字段,再進行一次JSON轉換(這是我項目中的坑)。
? ? 2.由于最開始畫了圖,所以更新時加上myAScan.clear();。先清空再畫
? ? 3.有些情況下若未更新,則設置Option的時候,給第2個參數賦為true即可