首页 > 代码库 > 深入解析DataTable如何过滤

深入解析DataTable如何过滤

此DataTable指的是SpryMedia专为HTML Table设计和开发的页面插件,官方站点是:http://legacy.datatables.net/index。

关于oSettings.aiDisplayMaster, oSettings.aiDisplay与oSettings.aoData

无论是从JSON中获取的行数据,还是从DOM元素中获取的行数据,在表初始化之后,皆存储在oSettings.aoData中。有多少条记录aoData数组就有多长。

而aiDisplayMaster则用于记录aoData中每行数据在根据列排序之后的位置。这个排序过程被安排在_fnSort()方法中。

并不是每行数据都需要显示,于是就有aiDisplay则用于保存需要显示的行记录,及其位置。aiDisplay来源于aiDisplayMaster,是aiDisplayMaster排序之后的子集。

在不使用filter的情况下,aiDisplay完全等于aiDisplayMaster。

过滤

所谓过滤其实是从aiDisplayMaster中,根据aoData的数据和匹配条件,把需要显示的行数据的序号按照aiDisplayMaster中已经排好的顺序保存在aiDisplay数组中。

过滤分全局过滤、基于列过滤和自定义过滤。

过滤在_fnFilterComplete()方法中执行,执行顺序是:全局过滤、基于列过滤、自定义过滤。这三个过滤分别对应:_fnFilter(), _fnFilterColumn(), _fnFilterCustom()。

全局过滤

全局过滤又分强制重新过滤和非强制重新过滤。所谓强制重新过滤即完全重新建立aiDisplay数组。而非强制重新过滤则是在前aiDisplay的基础上继续过滤。

需要注意的是,如果全局过滤字符串为空,aiDisplay将等于aiDisplayMaster。

使用强制全局过滤的情况包括:

  • 调用fnFilter()方法,无论有没有指定column;
  • 直接调用_fnFilter(oSettings,sInput, 1);
  • 调用_fnSort()方法;
  • 调用_fnFilterComplete()方法,但过滤字符串为空。

使用非强制全局过滤的情况包括:

  • 调用_fnReDraw()方法;
  • 调用_fnInitialize()方法,即初始化的时候;

基于列过滤

全局过滤之后就是列过滤,列过滤是在全局过滤的结果集aiDisplay上再过滤掉一些不需要显示的行数据序号。

列过滤依据来源于列选项mRender中当type==filter时返回的字符串。

列过滤在_fnFilterColumn方法中执行。

自定义过滤

自定义过滤是过滤的最后一步,是对列过滤的结果集aiDisplay的进一步过滤,这个过滤使用的方法需要定义在DataTable.ext.afnFiltering数组中。

每个自定义过滤方法接受三个参数(从左往右):

  • oSettings;
  • 行数据;
  • 行序号;

多关键字过滤

fnFilter方法中有一个参数是bSmart,但这这参数为true 时,关键字间的空格将作为分隔符。