完美避免easyui datagrid加载两次数据
很久没有碰easyui了,但工作问题需要写个动态数据表,最近又因数据量特大而碰到这个问题,就记录一下。
其中问题为:
1、数据量过百万级别,且字段特别多,三十多列,加载的数据可想而知了,如果需要连表查询呢?呵呵。。。。。(就算是分页,每次加载两百条数据,也有几M了)
2、数据表的字段需要根据使用者的筛选而进行显示。
3、easyui有bug,datagrid弄不好,加载数据就要加载多次,造成服务器资源紧张,况且,使用者也没那个耐心等。再者datagrid加载数据太久的话,loading效果就会过期,显示原有数据,但在后台还是会继续加载数据。
先说说datagrid为什么会加载两次数据:
easyui中渲染有两种方式:
1、在html表格标签中添加了class=“easyui-datagrid” :
<table id="dg" style="max-height:500px;width:100%;" class="easyui-datagrid" ></table>
2、js脚本配置:
$("#dg").datagrid({
url: '.../...',
singleSelect: true,
pagination: true,
//初始化页面尺寸
pageSize: 200,
//自定义页面尺寸
pageList: [200, 400,600, 800],
onBeforeLoad: function (param) { //加载数据前触发
var arr = $("#searchform").serializeArray();
for (var i = 0; i < arr.length; i++) {
param[arr[i].name] = arr[i].value;
}
},
columns: [[
]]
});
如果你两种都写了,那么在初始化的时候就会出现两次加载Json的问题。正确的写法只需要采用其中的一种就可以了。
##但是·····················
在有查询时或者重新加载数据:$(’#dg’).datagrid(‘load’);
抱歉,又会重新加载两次数据,真是bug的存在,这是因为在页面初始化后,datagrid也会初始化并加上了class=“easyui-datagrid” ,所以说,然并卵······
我的解决方法是:
1、如果页面初始化时,数据表不用立刻加载数据时,在js脚本与html中对于datagrid的初始化配置如下:
$("#dg").datagrid({
url: '',//注意这个一定为空
singleSelect: true,
pagination: true,
......})
<table id="dg" ></table> ///这里不用加class="easyui-datagrid" 有上面js配置加了也无所谓了
2、在查询加载数据的js方法需要变通:
//搜索
$(".search").on('click', function (e) {
$.chans.dialog.lodding("正在加载数据.....",false)
var pra = $("#searchform").serializeObject();
pra.page = 1;
pra.rows = $('#dg').datagrid('options').pageSize;
///使用ajax来获取数据,然后给datagird填充
$.ajax({
type: "post",
url: "/Controller/GetData",
dataType: "json",
contentType: "application/json",
data: JSON.stringify(pra),
success: function (data) {
//动态的表的字段配置
var c = get_cols_config();
$("#dg").datagrid({ columns: [c] });
//填充数据,需要注意数据格式{rows:[],total:99999999}
$('#dg').datagrid('loadData', data);
$.chans.dialog.close_alert();
},
error: function () {
$.chans.dialog.error("获取数据失败!", true);
}
});
});
问题也算是完美解决了,数据量再大,只要能加载出来就行,如果需要显示的行数较多,如上千行,渲染也算个大问题,目前我还没到这个地步!