自定义搜索功能和窗格

自定义搜索功能是搜索窗格的关键功能之一。它们允许程序员定义自己的选项放进搜索窗格。

注意:自定义搜索功能与 stateSave 不兼容。这是因为状态已保存为 JSON 对象,函数无法用 JSON 表示。

编写自定义函数

自定义搜索函数必须在 columns.searchPanes.options 数组中的对象内定义。在定义自定义搜索函数时,有两项需要定义的属性:

  • 标签 - 希望如何将选项显示在窗格中。
  • - 您的自定义函数。

自定义搜索函数接受两个参数

  • 行数据 - 当前在搜索函数中比较的行的数据。
  • 行序号 - 当前在搜索函数中比较的行序号。

如果要将行包含在结果集中,则函数应返回 true;如果不想包含在结果集中,则返回 false

下面显示了一个非常简单的示例,假设第 0 列是数字类型的年龄列。

$('myTable').DataTable( {
    searchPane: true,
    columnDefs:[
        {
            searchPanes:{
                options:[
                    {
                        label: 'Over 60',
                        value: function(rowData, rowIdx) {
                            return rowData[0] > 60;
                        }
                    }
                ]
            },
            targets: [0]
        }
    ]
})

这些自定义函数可以生成更复杂的搜索函数,只要它们在需要包含时返回 true,在不需要包含时返回 false 即可。以下示例将查找表格中所有素数年龄并显示出来。

$('myTable').DataTable( {
    searchPane: true,
    columnDefs:[
        {
            searchPanes:{
                options:[
                    {
                        label: 'Prime Ages',
                        value: function(rowData, rowIdx) {
                            let primeNumber = true;
                            for(let i = 2; i< Math.sqrt(rowData[0]); i++){
                                if(rowData[0] % i == 0){
                                    primeNumber = false;
                                    break;
                                }
                            }
                            return primeNumber && rowData[0] > 1;
                        }
                    }
                ]
            },
            targets[0]
        }
    ]
})

定义自定义搜索窗格

还可以定义不与特定列绑定的窗格。从技术上讲,尽管可以在现有与行绑定的列之一中跨多列搜索,但为它们创建另一个窗格似乎更加简洁。

为了做到这一点,我们在 searchPanes.panes 数组中定义了一个对象。此数组包含要创建的每个窗格的对象。对于这些对象中的每一个,都有一个 标题 属性,该属性包含要设置为窗格标题的字符串。还有一个 searchPanes 属性,该属性反过来有一个 options 属性,其中包含自定义搜索函数,如前所述。下面是一个示例。

$('#myTable').DataTable( {
    searchPanes: {
        panes: [{
            header: 'custom',
            options: [{
                label: 'Accountants in Tokyo',
                value: function(rowData, rowIdx){
                    return rowData[2] === 'Accountant' && rowData[3] === 'Tokyo';
                }
            }]
        }]
    }
} );

以上示例在表中搜索职位是“会计”且根据地是“东京”的人员。如上所述,向选项数组中添加更多对象将向新窗格添加更多选项。

函数上下文是宿主 DataTable 的一个 API 实例。这意味着在自定义搜索函数中可以调用 this.rows().data() 和其他 API 方法。