3. 警告:無法重新初始化 DataTable

DataTables 具有廣泛的設定選項,可用於在初始化時自訂表格,但僅限於初始化時。在 DataTable 初始化之後,任何嘗試使用這些選項都會導致錯誤。

含義

簡而言之,DataTables 不允許在初始化時間之外的任何時間更改初始化選項。初始化後對表格的任何操作都必須透過 API 完成,並且一旦表格已經初始化,嘗試設定初始化選項將導致錯誤

DataTables 警告:表格 id={id} - 無法重新初始化 DataTable。

其中 {id} 會被觸發錯誤的表格的 DOM id 取代。

診斷

當選定節點的 DataTable 實例已經初始化時,將選項傳遞給 DataTables 建構函式物件時,會觸發此錯誤。例如

$('#example').dataTable( {
    paging: false
} );


$('#example').dataTable( {
    searching: false
} );

當執行第二個程式碼區塊時會導致錯誤,因為 #example 已初始化為 DataTable。

解決方案

此錯誤可能會在程式碼中以多種方式出現,因此也有許多不同的方法可以解決此問題,具體取決於您嘗試實現的目標。

單一初始化

如果您想使用多個 DataTables 初始化選項,只需將它們全部一起應用於表格。在上面的範例錯誤中,我們嘗試停用分頁和搜尋,我們將使用

$('#example').dataTable( {
    paging: false,
    searching: false
} );

有關 DataTables 初始化和可用選項的更多資訊,請參閱初始化選項手冊

物件實例擷取

嘗試獲取 DataTable 的參考以使用 API 時,經常會發生此錯誤。例如,您可能有一個函式,它總是在建立時傳遞選項來嘗試建立 DataTable 實例。然後,您進行修改,在已經初始化的表格上呼叫此函式,就會出現此錯誤。

在這種情況下,您將需要使用 $.fn.dataTable.isDataTable() 靜態方法。這可以用來檢查表格是否已經是 DataTable。

if ( $.fn.dataTable.isDataTable( '#example' ) ) {
    table = $('#example').DataTable();
}
else {
    table = $('#example').DataTable( {
        paging: false
    } );
}

擷取

為了承認上面的程式碼結構並不總是特別吸引人,DataTables 具有一個 retrieve 選項,可用於告知 DataTables 您知道初始化選項在初始化後無法更改,並且如果發生這種情況,您只希望返回 DataTable 實例。

當獲取 DataTables 實例時,這個可選參數可以提供一個使用 $.fn.dataTable.isDataTable() 進行顯式檢查的快捷方式,如上所示

table = $('#example').DataTable( {
    retrieve: true,
    paging: false
} );

銷毀

有時您真的會想要更改表格的初始化參數,以應對 API 沒有提供您需要的選項的情況。可以透過兩種不同的方式來完成此操作,每種方式本質上都相同,但具有顯式方法和快捷選項,如上所示。

更改初始化參數的基礎是您需要銷毀舊表格,然後使用新選項建立新表格。這對頁面有非常顯著的效能影響,因為涉及大量的計算和 DOM 操作,因此如果可以避免這種情況並使用 API,強烈建議這樣做!

DataTables 提供了一個 destroy() 方法來銷毀舊表格,因此您可以初始化一個新的表格來取代它。例如

table = $('#example').DataTable( {
    paging: false
} );

table.destroy();

table = $('#example').DataTable( {
    searching: false
} );

請注意,在此處的第二次初始化中,將啟用分頁,因為它是一個全新的 DataTable,並且沒有明確停用分頁!

作為快捷方式,類似於 retrieve 選項,還有一個 destroy 選項可用於 DataTables,您知道它將銷毀現有表格以應用新選項。因此,上述銷毀範例可以縮短為

$('#example').DataTable( {
    paging: false
} );

$('#example').DataTable( {
    destroy: true,
    searching: false
} );

retrievedestroy 選項是互斥的,不能一起使用(這樣做會導致未定義的行為)。

原因

DataTables 初始化選項在初始化後無法動態更改的原因是,若要新增此功能,會在核心程式碼庫中新增大量程式碼(例如,動態啟用和停用捲動將相當複雜)。結果是,此功能不可用,以保持 DataTables 核心程式碼盡可能精簡。如上所述,如果對於您來說,能夠動態啟用和停用功能至關重要,則可以使用 destroy 選項,請注意這將帶來的效能影響。