自訂搜尋函式與搜尋窗格

自訂搜尋函式是搜尋窗格的關鍵功能之一。它們允許程式設計師定義他們自己的選項以顯示在搜尋窗格中。

注意:自訂搜尋函式與 stateSave 不相容。這是因為狀態是以 JSON 物件儲存,而函式無法以 JSON 表示。

撰寫自訂函式

自訂搜尋函式必須定義在 columns.searchPanes.options 陣列中的一個物件內。在定義自訂搜尋函式時,需要定義兩個屬性:

  • label - 您希望選項在窗格中顯示的方式。
  • value - 您的自訂函式。

自訂搜尋函式接受兩個參數:

  • rowData - 目前在搜尋函式中比較的列的資料。
  • rowIdx - 目前在搜尋函式中比較的列的索引。

如果該列要包含在結果集中,則函式應傳回 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 陣列中定義一個物件。此陣列包含要建立的每個窗格的物件。對於每個物件,都有一個 header 屬性,其中包含要設定為窗格標題的字串。還有一個 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 方法。