EasyUI - datagrid属性idField详解
2016-03-19 11:50
585 查看
EasyUI - datagrid属性idField详解
idField在
treegrid中的是一个必选的属性,在
datagrid中是一个可选的属性。
也许有人为了方便使用
getRowIndex会在
datagrid中设置
idField属性,如果不注意这个属性,那么在调用
getSelected或者
getChecked方法时会引起更多莫名其妙的问题。
这篇博客就是讲
datagrid中的
idField对
getSelected和
getChecked方法相关方法的影响。
因为
selected和
checked情况类似,下面就以
selected的情况来说明。
在选中一行的时候
执行的部分关键代码如下:if (opts.idField) { _5cf(_6b9.selectedRows, opts.idField, row); } opts.finder.getTr(_6b6, _6b7).addClass("datagrid-row-selected"); opts.onSelect.apply(_6b6, _5d0(_6b6, [_6b7, row]));
这里的
_6b9是
datagrid的
data-datagrid属性,获取方法为:
//使用jquery获取 $('#datagridId').data('datagrid'); //在easyui源码中使用下面方法获取 $.data(_6a7, "datagrid");
这个对象的一级属性如下图:
注意看这里的
checkedRows和
selectedRows属性。
继续看第一段代码,当
if (opts.idField)存在
idField属性的时候,会调用
_5cf方法:
function _5cf(a, o, r) { for (var i = 0, len = a.length; i < len; i++) { if (a[i][o] == r[o]) { return; } } a.push(r); };
这个方法就是当新选择的值和
selectedRows中已有的
idField值都不相同的时候,放到
selectedRows中。通过
idField避免重复!
当没有设置
idField属性的时候,就没有
selectedRows的事,只是调用下面的代码:
opts.finder.getTr(_6b6, _6b7).addClass("datagrid-row-selected");
这个代码就是给当前点击的行添加一个选中的样式,如下图:
通过上面代码我们应该已经了解选中一行的过程。
下面我们看当取消选中行时是如何处理的
关键代码如下:opts.finder.getTr(_6bb, _6bc).removeClass("datagrid-row-selected"); if (opts.idField) { _5cd(_6be.selectedRows, opts.idField, row[opts.idField]); }
看过前面的再看这里就容易很多了,首先
removeClass去掉选中的样式。
然后如果有
idField属性,执行
_5cd方法:
function _5cd(a, o, id) { if (typeof o == "string") { for (var i = 0, len = a.length; i < len; i++) { if (a[i][o] == id) { a.splice(i, 1); return; } } } else { var _5ce = _5cc(a, o); if (_5ce != -1) { a.splice(_5ce, 1); } } };
如果取消的列在
selectedRows中,就会从中移除(这里的else一般不会出现,不需要重视这里)。
到这儿我们就了解了
selectedRows增加和删除的情况。
注意1
这里要强调的是selectedRows中的值只能通过取消选择,或者
unselectAll取消 【当前页】 的选择,即使重新加载数据,或者清空数据,都不会影响
selectedRows中的值。想要取消全部选择怎么办?你可以使用
clearSelections方法:
$('#id').datagrid('clearSelections');
取消全部选择,这个方法和当前显示的数据或者加载过的数据无关。这个方法如下:
clearSelections: function (jq) { return jq.each(function () { var _76d = $.data(this, "datagrid"); var _76e = _76d.selectedRows; var _76f = _76d.checkedRows; _76e.splice(0, _76e.length); _6ba(this); if (_76d.options.checkOnSelect) { _76f.splice(0, _76f.length); } }); }
获取
selectedRows后,通过
_76e.splice(0, _76e.length);清空
selectedRows,这一步已经达到我们的基本目标了,然后是调用
_6ba(this);,这一步是取消当前页的选中状态(就是
unselectAll方法)。如果
checkOnSelect=true,在
_6ba方法中也有这个判断,会取消复选框选中状态,在这里会清空
checkedRows的值。
当你只想获取当前页的选择项时,最好的解决方法就是不设置
idField属性。否则就要自己处理好调用
clearSelections的时机。
注意2
同时你也应该了解,合理的使用idField还可以实现翻页选择(checkbox一样),这种情况下,你的
datagrid能记住每一页的选中情况,而且通过
getSelections(或
getChecked)来获取所有页中选中的行。
下面我们看当调用getSelected
方法时,是如何处理的
这个方法的定义如下:getSelected: function (jq) { var rows = _6a6(jq[0]); return rows.length > 0 ? rows[0] : null; }
获取
rows后返回第一个或者
null。在看
_6a6方法:
function _6a6(_6a7) { var _6a8 = $.data(_6a7, "datagrid"); var opts = _6a8.options; var data = _6a8.data; if (opts.idField) { return _6a8.selectedRows; } else { var rows = []; opts.finder.getTr(_6a7, "", "selected", 2).each(function () { rows.push(opts.finder.getRow(_6a7, $(this))); }); return rows; } };
当我们设置
idField时,直接将
selectedRows返回了。
如果没有设置
idField,就会使用
else中的方法,获取所有
selected的元素,然后一个个循环,放到
rows数组中返回。
从上面这两种处理方式来看,显然是有
idField的时候效率更高(else效率也不低)。
其他和
selected有关的方法,最终调用执行的都是上面提到的这些方法。这里不一一介绍了。
idField
最有用的地方getRowIndex
getRowIndex需要一个参数,
row或者
id的值,使用
id的前提就是设置
idField。
下面是
getRowIndex方法:
function _6a3(_6a4, row) { var _6a5 = $.data(_6a4, "datagrid"); var opts = _6a5.options; var rows = _6a5.data.rows; if (typeof row == "object") { return _5cc(rows, row); } else { for (var i = 0; i < rows.length; i++) { if (rows[i][opts.idField] == row) { return i; } } return -1; } };
当使用
row参数时,满足
typeof row == "object",之后调用
_5cc方法,和所有的
rows一一比较返回。
另外就是使用
idField方式,
_6a5.data.rows包含了当前页的所有行。对所有行循环,比较
idField相同的值,直接返回行号,这种方式使用也方便,因为我们业务中很容易能获取
id的值,而不容易得到一行
row。
最后
官方文档中对idField的介绍只有下面的这些:
idField - string - Indicate which field is an identity field.
只有通过查看源码你才能发现原来
idField竟然起了这么多的作用,这个属性隐藏的含义太多,不注意就会遇到“莫名其妙”的问题。
希望通过本文能让你对
datagrid中的
idField有所了解。
相关文章推荐
- UIBarButtonItem 、UITabBarItem 改变字体,大小,图片
- UVA 11324 The Largest Clique(tarjan有向图强连通+缩点)
- 对iOS 9 新增的控件 UIStackView 官方文档的翻译 第二部分
- 简易版子线程更新UI
- Easyui 更改datagrid 字体大小
- Codeforces 644B Processing Queries【STL】
- 基础控件属性及方法整理 --> UIImageView
- 执行Hadoop job提示SequenceFile doesn't work with GzipCodec without native-hadoop code的解决过程记录
- IOS 支付宝-五福简单框架实现-线性滚动(UICollectionView)
- codeforces 645E . Intellectual Inquiry
- UI第十四天
- UI第十三天
- CF 450 B Jzzhu and Sequences(矩阵快速幂)
- pair类型 这次遇到了,记录下来,方便彼此xue习
- UI第十二天
- UI第十一天
- Java程序StringBuilder的效率,验证字符串操作和字符串生成器的操作效率
- easyUI接收后台的参数不正确导致报length no defined
- Starting MySQL... ERROR! The server quit without updating PID file (/mydata/data/t1.pid).
- js构建ui的统一异常处理方案(一)