4. 警告:请求未知参数

这可能是 DataTables 将显示的最神秘的警告消息。这是一个简短的错误消息,因为它需要应对 DataTables 拥有的所有数据源选项,但有足够灵活性来传达每种情况的信息,因此在第一次检查时可能会显得有点神秘。但是,当我们将其分解为各个组成部分时,它实际上相对简单,如下所述。

含义

DataTables 中的每个单元格都会请求数据,当 DataTables 尝试获取单元格的数据但无法获取时,它会触发一个警告,告诉您数据不在预期的位置。警告消息是

DataTables 警告:table id={id} - 请求行的未知参数“{parameter}{行索引},列{列索引}”

其中

  • {id} 将替换为触发错误的表 DOM id
  • {parameter} 是 DataTables 正在请求的数据参数名称
  • {行索引} 是触发错误的行的数据表内部行索引 (row().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 行请求的未知参数“名称”。这表示使用 columns.data 的列无法获取有效的数据来显示,例如

{ data: 'Name' }

如果该行的 data source 对象没有 Name 参数,或者数据为 nullundefined,便会产生此错误。

因此,如果发生以下情况,通常会发生此错误

  • 指定的 data 属性不存在(拼写错误或数据中有空白)
  • 指定属性的值为 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 值都将替换为指定的值。在这种情况,将不会显示警告。