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
} );
retrieve
和 destroy
选项是互斥的,不能同时使用(这样做会导致不确定的行为)。
原因
在初始化后无法动态地更改 DataTables 初始化选项的原因是,添加此功能将会向核心代码库添加大量代码(例如,动态启用和禁用滚动将非常复杂)。因此,为了尽可能精简 DataTables 核心代码,不提供此功能。如上所述,如果您必须动态启用和禁用功能,可以使用 destroy
选项,请注意这会产生哪些性能影响。