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
} );
retrieve
和 destroy
選項是互斥的,不能一起使用(這樣做會導致未定義的行為)。
原因
DataTables 初始化選項在初始化後無法動態更改的原因是,若要新增此功能,會在核心程式碼庫中新增大量程式碼(例如,動態啟用和停用捲動將相當複雜)。結果是,此功能不可用,以保持 DataTables 核心程式碼盡可能精簡。如上所述,如果對於您來說,能夠動態啟用和停用功能至關重要,則可以使用 destroy
選項,請注意這將帶來的效能影響。