4. 警告:請求了未知的參數

這可能是 DataTables 會顯示的最難以理解的警告訊息。它是一個簡短的錯誤訊息,因為它需要處理 DataTables 的所有資料來源選項,但又要有足夠的彈性來傳達每個案例的資訊,這就是為什麼第一次檢查時它看起來有點難以理解的原因。然而,當我們將其分解為組成部分時,它實際上是相對簡單的,如下所述。

含義

DataTables 中的每個單元格都會請求資料,當 DataTables 嘗試獲取單元格的資料但無法獲取時,它將觸發警告,告訴您資料在預期位置不可用。警告訊息是

DataTables 警告:表格 id={id} - 請求了未知的參數 '{parameter}',針對列 {row-index},欄位 {column-index}

其中

  • {id} 被替換為觸發錯誤的表格的 DOM id
  • {parameter} 是 DataTables 正在請求的資料參數的名稱
  • {row-index} 是觸發錯誤的列的 DataTables 內部列索引 (row().index())。
  • {column-index} 是觸發錯誤的欄位的欄位資料索引 (column().index())。欄位索引資訊在 DataTables 1.10.10 中新增。

因此,簡而言之,DataTables 已針對給定列請求了 {parameter} 的資料,並且那裡沒有資料,或者它是 nullundefined (預設情況下,DataTables 不知道如何顯示這些參數 - 如果您的資料確實包含這些值,請參閱下文)。

診斷

理解此錯誤訊息的關鍵部分是它的 {parameter} 部分。它將是以下三種形式之一

  • 整數
  • 字串
  • 函式

參數是整數

{parameter} 是整數時,DataTables 正在尋找陣列中的資料。當使用 DOM 來源資料時 (即表格的資料是從文件中自動讀取) 通常是這種情況。在這種情況下,請求的資料在來源陣列中不存在 - 可能是因為陣列不夠長。如果發生以下情況,可能會發生這種情況

  • 表格的 tbody 中存在 colspanrowspan,DataTables 不支援這些屬性。
  • 使用 columnscolumnDefs,您指定的欄位多於 HTML 中的欄位
  • 表格中的儲存格數量不符合方程式 #cells = #columns * #rows (即,標題中定義的欄位多於表格主體中,反之亦然)。

參數是字串

如果 {parameter} 顯示為字串,這通常表示您已使用 columns.datacolumns.render 從物件中提取資料,無論是 Ajax 載入還是來自客戶端。例如,讀取的錯誤訊息為:針對第 0 列請求了未知的參數 'Name'。這表示使用 columns.data 的欄位無法獲取要顯示的有效資料 - 例如

{ data: 'Name' }

如果列的資料來源物件沒有 Name 參數,或者資料為 nullundefined,則會產生此錯誤。

因此,如果發生以下情況,通常會發生此錯誤

  • 指定的資料屬性不存在 (錯字或資料缺失)
  • 指定的屬性值為 null

參數是函式

如果 {parameter} 僅顯示 {function},則表示 columns.datacolumns.render 已作為函式給定,但該函式傳回了 nullundefined。例如,以下程式碼會觸發此類錯誤

{ data: function ( row, type, set ) {
    if ( type === 'display' ) {
        return row.Name;
    }
} );

請注意,只有在 type === 'display' 時才會使用 return 陳述式。因此,如果 type 不是 display,則 undefined 是函式的傳回值,而 DataTables 會擲回警告。

解決方案

解決此錯誤的關鍵是確保 DataTables 具有所有需要的資料。具體來說,請檢查以下內容

  • 表格的 tbody 中未使用 colspanrowspan
  • 方程式 #cells = #columns * #rows 成立。
  • 如果使用 columns,請確保您已精確指定表格的 HTML 中存在的欄位數量。
  • 此外,如果使用 `dt-init columns,請移除您可能在陣列結尾處的任何結尾逗號。額外的逗號可能會導致舊瀏覽器出現問題。
  • 如果使用 dt-init columnDefs`,請確保您指定的欄位沒有多於 HTML 中存在的欄位
  • 如果使用 columns.rendercolumns.data,請確保它們傳回值 (JavaScript 中沒有傳回值與傳回 undefined 相同,這會導致此錯誤)。
  • 確保伺服器端腳本成功完成執行。例如,長時間執行的腳本可能會逾時。伺服器錯誤日誌會指示是否為這種情況。

nullundefined 資料

資料來源中的 nullundefined 值絕對是有效的,而且通常非常有用。預設情況下,DataTables 會警告使用它們,因為大多數情況下它們並非旨在顯示 - 例如,您可能希望顯示 尚未設定,或者僅顯示空字串 (空單元格),而不是在表格中顯示 null。為此,DataTables 具有 columns.defaultContent 選項。

設定 columns.defaultContent 後,任何 nullundefined 值都將被替換為指定的值。在這種情況下,不會顯示警告。