谈谈easyui datagrid 的数据加载(转)
这篇文章只谈jQuery easyui datagrid 的数据加载,因为这也是大家谈论最多的内容。其实easyui datagrid加载数据只有两种方式:一种是ajax加载目标url返回的json数据;另一种是加载js对象,也就是使用loadDate方法。
这里就自己的使用经验,对两种方式做简单总结和归纳,并且对使用过程中容易产生的误区做较为详细的描述,希望能对大家有所帮助。
url方式加载数据
调用方式
目前可能大多数人都是选择这种方式,因为跟流行的框架结合的也比较好,使用url的话,可以将url写在DOM里面或者申明datagrid对象的url属性,以下两种方式都是可以的:
- <table id="tt" style="width:700px;height:auto" title="DataGrid" idField="itemid" url="datagrid_data2.json">
- $('#test').datagrid({
- url:'datagrid_data2.json'
- });
相关方法
| load | param | 加载第一页数据,param将代替默认查询参数,注意的是该方法只适用于url方式. |
| reload | param | 刷新当前页数据,与load方法不同的时候reload方法刷新当前页数据,而load方法会跳到第一页然后刷新. |
| options | null | 获取datagrid实例的各项参数值,常用的参数有url,pageNumber,pageSize这三个参数在请求数据以及分页功能中起重要作用. |
二次加载问题
对于使用url方式的初学者,经常碰到重复请求的问题,这个问题的根源是多次渲染组件,如何避免二次加载这样问题呢,个人觉得注意以下两点基本就可以防止二次加载了。
- 使用load和reload函数去动态加载数据,而不是选择再次渲染组件。很多人再次渲染组件的目的仅仅是为了设置url,这得不偿失,url的设置可以通过options方法获取到组件实例的opts,然后在给opts.url重新赋值即可;
- class方式注册组件和javascript注册方式不要同时使用。class注册方式一般是为了初始化属性,javascript方式则属性和事件都可初始化,但是不管是class方式还是javascipt方式注册组件,每次注册,只要被设置过url属性就会做请求。所以在不可避免要使用javascript方式注册的情况下,索性就不要使用class方式注册了。
因为url方式网上的资料特别多,我这里就简述这么多,下面重点讨论一下loadDate方式加载数据。
加载本地数据方式
首先要明白“加载本地数据”是个什么概念,这里指的是加载javascript对象数据,而javascript数据对象显然可以使是通过其它异步方式获得的,所以这个“加载本地数据”的描述并不准确。
调用方式
先要将url属性设置为null,或者不设置,然后使用datagrid的loadDate方法加载js数据对象,这个对象包含两个属性,一个是记录总数,一个是当前页码的对象数组。例如:
- var obj = {'total':100,'rows':[{id:'1',name:'一'},{id:'2',name:'二'}]};
- $('#tt').datagrid('loadData',obj);
如何分页
不对源码做任何改动的话,可以首先获取datagrid的Pagination对象,然后通过写Pagination对象的onSelectPage事件来实现分页:
- //初始化dategrid
- $('#tt').datagrid({
- url:null,
- pagination:true,
- pageSize:20,
- pageNumber:1,
- rownumbers:true
- });
- $('#tt').datagrid('getPager').pagination({
- displayMsg:'当前显示从 [{from}] 到 [{to}] 共[{total}]条记录',
- onSelectPage : function(pPageIndex, pPageSize) {
- //改变opts.pageNumber和opts.pageSize的参数值,用于下次查询传给数据层查询指定页码的数据
- var gridOpts = $('#tt').datagrid('options');
- gridOpts.pageNumber = pPageIndex;
- gridOpts.pageSize = pPageSize;
- //定义查询条件
- var queryCondition = {name:"世纪之光"};
- //异步获取数据到javascript对象,入参为查询条件和页码信息
- var oData = getAjaxDate("orderManageBuz","qryWorkOrderPaged",queryCondition,gridOpts);
- //使用loadDate方法加载Dao层返回的数据
- $('#tt').datagrid('loadData',{"total" : oData.page.recordCount,"rows" : oData.data});
- }
- });
上面的代码应该很容易看懂了,做出来的分页基本也算正常,唯一的缺憾就是写起来不怎么便捷。那么如何才能便捷地实现分页呢?
之前我写过jQuery easyui datagrid 非URL后台分页的文章,稍微对easyui datagrid做下扩展,增加一个doPagination事件,那么编码就较为简单了。
- //初始化dategrid
- $('#tt').datagrid({
- url:null,
- pagination:true,
- pageSize:20,
- pageNumber:1,
- rownumbers:true,
- doPagination:function(pPageIndex, pPageSize) {
- var gridOpts = $('#tt').datagrid('options');
- //定义查询条件
- var queryCondition = {name:"世纪之光"};
- //异步获取数据到javascript对象,入参为查询条件和页码信息
- var oData = getAjaxDate("orderManageBuz","qryWorkOrderPaged",queryCondition,{pageNumber:gridOpts.pageNumber,pageSize:gridOpts.pageSize});
- //使用loadDate方法加载Dao层返回的数据
- $('#tt').datagrid('loadData',{"total" : oData.page.recordCount,"rows" : oData.data});
- },
- });
这种方式就不用再去获取Pagination对象了,而且也不用设置opts的pageNumber和pageSize这两个属性了,编码变得简易了,是不是变得清爽了很多呢?
加载中效果
easyui datagrid只有在使用url方式获取数据的时候才会显示“加载中……”的遮罩效果,使用loadDate方法加载数据的话,其实也可以用上这效果,只不过稍微麻烦些:
- //初始化dategrid
- $('#tt').datagrid({
- url:null,
- pagination:true,
- pageSize:20,
- pageNumber:1,
- rownumbers:true,
- doPagination:function(pPageIndex, pPageSize) {
- //改变opts.pageNumber和opts.pageSize的参数值,用于下次查询传给数据层查询指定页码的数据
- var gridOpts = $('#tt').datagrid('options');
- gridOpts.pageNumber = pPageIndex;
- gridOpts.pageSize = pPageSize;
- Exec_Wait('tt','loadDateGrid()');
- },
- });
- function loadDateGrid(){
- var gridOpts = $('#tt').datagrid('options');
- //定义查询条件
- var queryCondition = {name:"世纪之光"};
- //异步获取数据到javascript对象,入参为查询条件和页码信息
- var oData = getAjaxDate("orderManageBuz","qryWorkOrderPaged",queryCondition,gridOpts);
- //使用loadDate方法加载Dao层返回的数据
- $('#tt').datagrid('loadData',{"total" : oData.page.recordCount,"rows" : oData.data});
- }
- /**
- * 封装一个公用的方法
- * @param {Object} grid table的id
- * @param {Object} func 获取异步数据的方法
- * @param {Object} time 延时执行时间
- */
- function Exec_Wait(grid,func,time){
- var dalayTime = 500;
- __func_=func;
- __selector_ = '#' + grid;
- $(__selector_).datagrid("loading");
- if (time) {
- dalayTime = time;
- }
- gTimeout=window.setTimeout(_Exec_Wait_,dalayTime);
- }
- function _Exec_Wait_(){
- try{eval(__func_);
- }catch(e){
- alert("__func_:" + __func_ + ";_ExecWait_" + e.message);
- }finally{
- window.clearTimeout(gTimeout);
- $(__selector_).datagrid("loaded");
- }
- }
当然了,你也可以利用datagrid的onLoadSuccess事件来实现,反正最终都是调用datagrid的loding和loaded方法完成等待DIV的显示和隐藏的:
- function loadDateGrid(){
- $('#tt').datagrid('loading');//打开等待div
- var queryCondition = {
- name: "世纪之光"
- };
- var oData = getAjaxDate("orderManageBuz", "qryWorkOrderPaged", queryCondition, oPage);
- $('#tt').datagrid('loadData', {
- "total": oData.page.recordCount,
- "rows": oData.data
- });
- }
- $('#tt').datagrid({
- onLoadSuccess: function(){
- //加载完数据关闭等待的div
- $('#tt').datagrid('loaded');
- }
- });
如何不统计总数
有时候数据层的数据量特别大,查询统计总数的话会很耗时,统计总数就显得不怎么合适了,如何不统计总数完全看你后台怎么写了,可以虚拟一个一个总数,这个数字总是比当前页码大1就行了,具体实现就不在本篇文章关注的范围内了。
到这里,loadData方式加载grid数据就已经算是完美了,至少该有的问题均已经解决了,希望大家有更好建议一起交流……
- //增加查询参数,在页面加载时运行
- function reloadgrid() {
- var test =document.getElementById("NodeChild").innerHTML;
- //查询参数直接添加在queryParams中
- $('#HaveInput').datagrid({
- url:"ScoresDetailsCity.ashx?test=" + test
- })
- var queryParams =$('#HaveInput').datagrid('options').queryParams;
- getQueryParams(queryParams);
- $('#HaveInput').datagrid('options').queryParams = queryParams;
- $("#HaveInput").datagrid('reload');
- }
谈谈easyui datagrid 的数据加载(转)的更多相关文章
- [转载]再次谈谈easyui datagrid 的数据加载
这篇文章只谈jQuery easyui datagrid 的数据加载,因为这也是大家谈论最多的内容.其实easyui datagrid加载数据只有两种方式:一种是ajax加载目标url返回的json数 ...
- 再次谈谈easyui datagrid 的数据加载
from:http://www.easyui.info/archives/204.html 这篇文章只谈jQuery easyui datagrid 的数据加载,因为这也是大家谈论最多的内容.其实ea ...
- 谈谈easyui datagrid 的数据加载
文章目录 1url方式加载数据 1.1调用方式 1.2相关方法 1.3二次加载问题 2加载本地数据方式 2.1调用方式 2.2如何分页 2.3加载中效果 2.4如何不统计总数 这篇文章只谈jQuery ...
- jQuery easyui datagrid 的数据加载
其实easyuidatagrid加载数据只有两种方式:一种是ajax加载目标url返回的json数据:另一种是加载js对象,也就是使用loadDate方法,这种方法用于加载本地js数据(非ur ...
- easyui datagrid 的数据加载Json数据
var obj = {'total':100,'rows':[{id:'1',name:'一'},{id:'2',name:'二'}]}; $('#tt').datagrid('loadData',o ...
- EasyUI - DataGrid 组建 - [ 组件加载和分页 ]
效果: 原理:通过POST传递到数据后台字段. 此时上传的参数,page:当前页数,rows:每页显示的页数. 有此两项参数,计算取出数据条数. 通过后台接受参数,进行处理并返回抽取的数据. html ...
- 轻松搞定 easyui datagrid 二次加载的问题(转)
对于使用url方式的初学者,经常碰到重复请求的问题,这个问题的根源是因为一旦设置了url参数,Datagrid组件在实例化的时候就会做请求,如何避免二次加载这样问题呢,个人觉得注意以下两点基本就可以防 ...
- easyUI datagrid 刷新取消加载信息 自动刷新闪屏问题
<style type="text/css"> /*-- 消除grid屏闪问题 --//*/ .datagrid-mask { opacity: 0; filter: ...
- EasyUI datagrid 数据加载
网上找了好多人的方法发现都有问题发一个可用方便的 主要分三种情况 加载1,loaddata 加载2,datagrid 加载3, url 加载 第一部分,datagrid加载 第二部分,点击 datag ...
随机推荐
- 如何在Jenkins中使用环境变量
以BUILD_NUMBER为例, 1.在windows batch命令中使用此环境变量,使用%BUILD_NUMBER%即可 2.在Linux shell命令中使用此环境变量,使用${BUILD_NU ...
- spark读取 kafka nginx网站日志消息 并写入HDFS中(转)
原文链接:spark读取 kafka nginx网站日志消息 并写入HDFS中 spark 版本为1.0 kafka 版本为0.8 首先来看看kafka的架构图 详细了解请参考官方 我这边有三台机器用 ...
- Java按键事件KeyEvent
按键事件可以利用键盘来控制和执行一些动作,或者从键盘上获取输入,只要按下,释放一个键或者在一个组件上敲击,就会触发按键事件.KeyEvent对象描述事件的特性(按下,放开,或者敲击一个键)和对应的值. ...
- Memento 备忘录 快照模式 MD
备忘录模式 简介 在不破坏封装的前提下,捕获一个对象的[内部状态],并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态. 角色: 发起人Originator:要被备份的成员,它提供 ...
- sass与less
刚刚发现sass这个东西,前端真热闹,下面比较一下这两者的共同点与区别. 开头总结一下,方便记忆:sass依赖后端计算能力,less依赖客户端的计算能力. 很多开发者不选择LESS是因为LESS输出修 ...
- matlab:eval用法
1.自动生成变量 % auto general variabalsb=rand(3,3)for i=1:8 eval(['a_',num2str(i),'=','b(',num2str(i),' ...
- Activiti Designer 5.14.1插件安装和使用
1.离线包下载 离线安装包下载:https://files.cnblogs.com/files/modou/Activiti_BPMN_2.0_designer.rar 2.安装 先把jars文件夹中 ...
- miniupnpc
upnp端口映射: http://bbs.csdn.net/topics/70382968 UPnP端口映射实现过程(二) http://blog.csdn.net/jiuaiwo1314/artic ...
- IOS企业开发者帐号申请
想使用 XCode 的联机调试功能,必须先注册成为苹果开发者,再出99刀加入苹果 iOS 开发者计划才可以.加入苹果 iOS 开发者计划的方法 Google 一下就会找到很多链接.但是这些链接的内容都 ...
- PHP MySQL -处理语句
PHP MySQL 预处理语句 预处理语句对于防止 MySQL 注入是非常有用的. 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. 预处理语句的工作原理如下: 预 ...