此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 时,关键字间的空格将作为分隔符。
深入解析DataTable如何过滤,布布扣,bubuko.com