jQuery DataTables:如何显式设置 table 实例名称/table ID 以用于状态保存?

jQuery DataTables: How can I explicitly set the table instance name / table ID to use with state saving?

背景:

我将 DataTables 与名为 "Turbolinks" 的 JS 库结合使用,这基本上可以将您的应用程序转变为单页应用程序 (SPA),而无需使用真正的客户端框架的所有开销。它对 Ruby Rails 应用程序性能非常有用。

虽然它引入了一些令人头疼的问题 - 一个是与 DataTables 的兼容性。通过基本上销毁 Turbolinks 导航上的任何数据表,然后在再次加载 turbolinks 页面时重新初始化它,我已经让它工作得很好。这种方法效果很好,似乎是关于让 DataTables 与 Turbolinks 一起工作的最佳实践的全面接受的答案。

问题:

我试图添加到我的一些应用程序中的最后一个功能/收尾工作是 DataTable 状态保存。我面临的问题是,每次 table 在页面导航中是 destroyed/re-initialized 时,......我实际上不太确定如何称呼它,但从检查stateSaveCallback 上的设置对象 - 它看起来像 sInstance and/or sTableId:

DataTables_Table_0

然后 localStorage 键被设置为:

DataTables_DataTables_Table_0_/current_path: "{data: data}"

其中 current_path 是 path/page 你所在的位置。

然后当它在返回页面时重新初始化时,它被设置为 DataTables_Table_1,依此类推 - 所以状态永远不会正确加载。

有没有办法覆盖该 ID(或某种方式在 stateSaveCallback / stateLoadCallback 中设置它的名称),这样它就不会增加最后一个“0”, '1',等等在它的末尾?这样当 table 被重新初始化时,它将从 DataTables_Table/current_path?

中提取保存的状态

答案就是给 table 一个 ID!然后 DataTables 不会为它分配自己的 ID 和递增的数字,saveState 选项就可以了。

此外,destroy/re-init 实际上会导致服务器在 AJAX table 的情况下被命中两次。

更好的方法是禁用任何包含数据table的索引页的 turbolinks 缓存。否则,您最终会在只需要一个请求时向服务器发出两个请求。