完美避免easyui datagrid加载两次数据

完美避免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);
                }
            });
        });

问题也算是完美解决了,数据量再大,只要能加载出来就行,如果需要显示的行数较多,如上千行,渲染也算个大问题,目前我还没到这个地步!

发布了15 篇原创文章 · 获赞 15 · 访问量 1647

猜你喜欢

转载自blog.csdn.net/u011323200/article/details/88863881