在项目中开发图表功能时用到了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 + ' 占比:' + params.percent + '%'; } } }, emphasis: { label: { formatter: function (params) { return params.percent + '%'; } } } } } ] }, isResize: true //是否根据窗口大小改变图表大小 });
结束:欢迎指出我文中的错误和不足,在此先行谢过了☆⌒(*^-゜)v