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}
没有数据,或者是 null
或 undefined
(DataTables 默认不知道如何显示这些参数 - 参见下文,如果您的数据确实包含这些值)。
诊断
理解此错误消息的关键部分是其 {parameter}
方面。它将有三种形式之一
- 整数
- 字符串
- 函数
参数是一个整数
当{parameter}
是一个整数时,DataTables 会在数组中查找数据。当使用 DOM 源数据(即从文档中自动读取用于表格的数据)时,通常会看到这种情况。在这种情况下,请求的数据在源数组中不存在 - 可能是因为数组不够长。如果发生以下情况,可能会发生这种情况
- 表格的
tbody
中有colspan
或rowspan
,而 DataTables 不支持这个。 - 使用
columns
或columnDefs
指定的列数比 HTML 中的列数多 - 表格中的单元格数不满足等式
#cells = #columns * #rows
(即在表头中定义的列数多于表主体中的列数,反之亦然)。
参数是一个字符串
如果{parameter}
显示为一个字符串,这通常表示您已使用 columns.data
或 columns.render
从一个对象中提取数据,无论它是通过 Ajax 加载的还是从客户端加载的。例如,读取中的错误消息:为第 0 行请求的未知参数“名称”。这表示使用 columns.data
的列无法获取有效的数据来显示,例如
{ data: 'Name' }
如果该行的 data source 对象没有 Name
参数,或者数据为 null
或 undefined
,便会产生此错误。
因此,如果发生以下情况,通常会发生此错误
- 指定的 data 属性不存在(拼写错误或数据中有空白)
- 指定属性的值为 null
参数是一个函数
如果 {parameter}
只是简单地说 {function},这意味着已将 columns.data
或 columns.render
作为函数提供,但函数返回了null
或 undefined
。例如,以下内容将触发这样的错误
{ data: function ( row, type, set ) {
if ( type === 'display' ) {
return row.Name;
}
} );
请注意,只有当 type === 'display'
时,才会使用 return 语句。因此,如果 type
不是 display,那么 undefined
是函数的返回值,DataTables 会发出警告。
解决方案
解决此错误的关键在于确保 DataTables 拥有所需的所有数据。具体来说,请检查以下内容
- 表格的
tbody
中没有使用colspan
和rowspan
。 - 等式
#cells = #columns * #rows
得到满足。 - 如果使用
columns
,请确保已确切指定表格 HTML 中存在的列数。 - 另外,如果使用 `dt-init columns,请删除数组末尾可能存在的任何尾随逗号。对于较老的浏览器,额外的逗号可能会造成问题。
- 如果使用 dt-init columnDefs”,请确保尚未指定多于 HTML 中存在的列数
- 如果使用
columns.render
或columns.data
,请确保它们返回一个值(JavaScript 中没有返回值与返回undefined
相同,这将导致此错误)。 - 确保服务器端脚本能够成功完成其执行。例如,长时间运行的脚本可能会超时。如果是这种情况,服务器错误日志将给出指示。
null
或 undefined
数据
数据源中的 null
和 undefined
值当然有效且经常很有用。默认情况下,DataTables 会警告使用它们,因为大多数时候它们都不是为了显示而设计的——例如,您可能希望在表中显示 尚未设置 或空字符串(空单元格)而不是显示 null。因此,DataTables 有一个 columns.defaultContent
选项。
设置 columns.defaultContent
后,所有 null
或 undefined
值都将替换为指定的值。在这种情况,将不会显示警告。