在項目中開發圖表功能時用到了Echars和一個關於Echars的java類庫(http://git.oschina.net/free/ECharts)。這個類庫主要目的是方便在Java中構造ECharts中可能用到的數據結構,即我們可以直接在后端構造好一個Option對象(java對象),將其轉換為JSON字符串后返回給前端。但是在Echarts中的Option配置項中,通常需要配置一些函數類型的參數,在后端構造的Option對象只能以拼接字符串的方式在傳遞函數類型的參數,這樣拼接不僅繁瑣,而且通過使用java提供的一些Json工具包將后台構造的Option對象轉換為json字符串時容易出現錯誤。所以我對Echars進行了簡單的封裝,如下代碼:
/*
* Created by liubaozhe on 2016/7/20.
*/
function EcharsFun(){
this.cfg={
echartsInitDom:null, //初始化DOM節點,jquery對象類型 (必選)
ajaxUrl:null, //ajax 提交路徑(必選)
ajaxParam:{}, //ajax 參數(必選)
ajaxSuccess:null, //ajax請求成功回調函數
option :null,//option 對象參數
isResize:true //是否根據窗口大小改變圖表大小
}
}
EcharsFun.prototype=$.extend({},{
doAjax:function(){
var that=this;
$.ajax({
url: that.cfg.ajaxUrl,
type: "POST",
data:that.cfg.ajaxParam,
dataType :"json",
error: function(XMLHttpRequest, textStatus, errorThrown) {
that.error(XMLHttpRequest, textStatus, errorThrown);
},
success: function(data){
that._success(data);
},
beforeSend: function() {//請求前回調函數
that.beforeSend();
},
complete:function(XMLHttpRequest, textStatus) { //請求完成回調函數
that.complete(XMLHttpRequest, textStatus);
}
});
},
beforeSend:function(){
var that=this;
that._myChart.clear();
that._myChart.showLoading({
text: '正在努力的讀取數據中...' //loading話術
})
},
complete:function(){
var that=this;
that._myChart.hideLoading();
},
_success:function(data){
var that=this;
var option={};
if(data && data.option){
option = $.parseJSON(data.option);
}
//如果option對象不為空,進行合並參數
if(!$.isEmptyObject(option)) {
$.extend(true,option, that.cfg.option); //合並option
}
//設置ajax回調函數
that.cfg.ajaxSuccess && that.cfg.ajaxSuccess(data);
//設置option
that._myChart.setOption(option,true);
},
error:function (error) {
console.error("圖表請求數據失敗!");
},
initEcharts:function() {
var that = this;
that._myChart = echarts.init(that.cfg.echartsInitDom[0]);
},
bindEvent:function(){ //綁定UI事件
var that=this;
if(that.cfg.isResize){
window.onresize = that._myChart.resize;
}
},
init:function(cfg){
var that=this;
that._myChart=null;
$.extend(that.cfg,cfg);
that.initEcharts();
that.doAjax();
that.bindEvent();
}
});
使用方法:
var echars = new EcharsFun();
echars.init({
echartsInitDom: $('#issue-total-bar'),
ajaxUrl:createIssueTotalPie.do, //ajax 提交路徑(必選)
ajaxParam: $('from').serializeObject(),
isResize: true //是否根據窗口大小改變圖表大小
});
如果需要配置函數參數,和正常配置Echarts 的option一樣,這里的配置項優先級高,會覆蓋后端生成的配置:
var echars = new EcharsFun();
echars.init({
echartsInitDom: $('#issue-total-bar'),
ajaxUrl:createIssueTotalPie.do, //ajax 提交路徑(必選)
ajaxParam: $('from').serializeObject(),
option: {
series: [
{
itemStyle: {
normal: {
label: {
formatter: function (params) {
return params.name + ':' + params.value + '\n占比:' + params.percent + '%';
}
}
},
emphasis: {
label: {
formatter: function (params) {
return params.percent + '%';
}
}
}
}
}
]
},
isResize: true //是否根據窗口大小改變圖表大小
});
結束:歡迎指出我文中的錯誤和不足,在此先行謝過了☆⌒(*^-゜)v
