EasyUI - datagrid属性idField详解
idField
在treegrid
中的是一个必选的属性,在datagrid
中是一个可选的属性。
也许有人为了方便使用getRowIndex
会在datagrid
中设置idField
属性,如果不注意这个属性,那么在调用getSelected
或者getChecked
方法时会引起更多莫名其妙的问题。
这篇博客就是讲datagrid
中的idField
对getSelected
和getChecked
方法相关方法的影响。
因为selected
和checked
情况类似,下面就以selected
的情况来说明。
在选中一行的时候
执行的部分关键代码如下:
这里的_6b9
是datagrid
的data-datagrid
属性,获取方法为:
这个对象的一级属性如下图:
注意看这里的checkedRows
和selectedRows
属性。
继续看第一段代码,当if (opts.idField)
存在idField
属性的时候,会调用_5cf
方法:
这个方法就是当新选择的值和selectedRows
中已有的idField
值都不相同的时候,放到selectedRows
中。通过idField
避免重复!
当没有设置idField
属性的时候,就没有selectedRows
的事,只是调用下面的代码:
这个代码就是给当前点击的行添加一个选中的样式,如下图:
通过上面代码我们应该已经了解选中一行的过程。
下面我们看当取消选中行时是如何处理的
关键代码如下:
看过前面的再看这里就容易很多了,首先removeClass
去掉选中的样式。
然后如果有idField
属性,执行_5cd
方法:
如果取消的列在selectedRows
中,就会从中移除(这里的else一般不会出现,不需要重视这里)。
到这儿我们就了解了selectedRows
增加和删除的情况。
注意1
这里要强调的是selectedRows
中的值只能通过取消选择,或者unselectAll
取消 【当前页】 的选择,即使重新加载数据,或者清空数据,都不会影响selectedRows
中的值。想要取消全部选择怎么办?你可以使用clearSelections
方法:
取消全部选择,这个方法和当前显示的数据或者加载过的数据无关。这个方法如下:
获取selectedRows
后,通过_76e.splice(0, _76e.length);
清空selectedRows
,这一步已经达到我们的基本目标了,然后是调用_6ba(this);
,这一步是取消当前页的选中状态(就是unselectAll
方法)。如果checkOnSelect=true
,在_6ba
方法中也有这个判断,会取消复选框选中状态,在这里会清空checkedRows
的值。
当你只想获取当前页的选择项时,最好的解决方法就是不设置idField
属性。否则就要自己处理好调用clearSelections
的时机。
注意2
同时你也应该了解,合理的使用idField
还可以实现翻页选择(checkbox一样),这种情况下,你的datagrid
能记住每一页的选中情况,而且通过getSelections
(或getChecked
)来获取所有页中选中的行。
下面我们看当调用getSelected
方法时,是如何处理的
这个方法的定义如下:
获取rows
后返回第一个或者null
。在看_6a6
方法:
当我们设置idField
时,直接将selectedRows
返回了。
如果没有设置idField
,就会使用else
中的方法,获取所有selected
的元素,然后一个个循环,放到rows
数组中返回。
从上面这两种处理方式来看,显然是有idField
的时候效率更高(else效率也不低)。
其他和selected
有关的方法,最终调用执行的都是上面提到的这些方法。这里不一一介绍了。
idField
最有用的地方getRowIndex
getRowIndex
需要一个参数,row
或者id
的值,使用id
的前提就是设置idField
。
下面是getRowIndex
方法:
当使用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
有所了解。