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 应当表示上述代码结构并不总是特别有吸引力,因此 DataTables 有一个 retrieve 选项,可用于告知 DataTables 您已意识到在初始化后不能更改初始化选项,如果确实发生,则您只需返回 DataTable 实例。

此可选参数可提供快捷方式,以明确使用 $.fn.dataTable.isDataTable() 来获取 DataTables 实例

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 选项,请注意这会产生哪些性能影响。