gpt4 book ai didi

datatables - 如何防止 DataTables 根据过时的保存状态显示或隐藏列

转载 作者:行者123 更新时间:2023-12-02 06:58:36 28 4
gpt4 key购买 nike

我有一个由 DataTables 1.10 驱动的表。过滤已打开。当我在下面谈论“做搜索”时,我指的是使用该表的过滤功能。

问题描述

关闭 stateSave 一切正常。但是,当 stateSave 打开时,会发生以下情况:

  1. Alice 以管理员身份登录。因为 admin 拥有所有权限,所以当她搜索文章时,她可以看到所有文章。因为有些文章已发表而有些未发表,所以该表有一列显示哪些已发表,哪些未发表。到目前为止一切顺利。

  2. Bob,一个随机用户,访问了这个网站。随机用户永远看不到未发布的文章,因此该表隐藏了显示发布状态的列。到目前为止一切顺利。

  3. Alice 注销。她现在像一个随机用户一样访问该站点。所以她应该看到 Bob 所看到的。但是,当她进行搜索时,她仍然看到指示发布状态的列。

(注意:我在这里讨论的问题纯粹是用户界面之一。服务器确保非特权用户永远无法获得未发表文章的记录。问题是额外的列为非特权用户提供他们不需要的信息。他们只能在搜索中看到已发布的文章,因此他们不需要看到他们在搜索中获得的每篇文章都已发布。)

配置数据表的代码通过执行如下操作隐藏发布列:

var columnDefs = [];
if (!privileged) {
columnDefs.push({
targets: [1],
orderable: false,
visible: false
});
}

columnDefs 作为 columnDefs 选项传递给 DataTables。

问题的技术原因

问题是 DataTables 将列可见性之类的东西存储到它保存到 localStorage 中的状态中。因此,当 Alice 注销并以非特权用户身份再次进行搜索时,即使 columnDefs 的值是正确的,它也会被保存的状态覆盖。该状态是在 Alice 是管理员时存储的,它声明发布列是可见的,因此即使 Alice 以非特权用户身份访问网站时它仍然可见。

我想要的是让用户从保存的状态中受益,但避免在用户权限更改时保留此状态。

注意事项:

  1. 我不想使用 sessionStorage,因为我希望状态在浏览器关闭之间保持不变,但 sessionStorage 在浏览器关闭时被清除。

  2. 我无法使用服务器分配的 session cookie 来检测登录和注销,因为它只是 HTTP。此外,特权可能会因其他原因而改变。

  3. 我不想任意设置保存状态的过期时间。

最佳答案

我确定的解决方案是在保存的数据中使用一个附加字段来了解我关心的条件何时发生了变化。该字段的值会根据用户当前 拥有的权限而变化。例如,因为在我在这里描述的情况下,我决定根据名为 priviledged 的变量(根据服务器提供的数据初始化)来隐藏或显示一列,它可以是简单如:

var token = privileged;

然后我设置stateSaveParams来记录保存状态时的token:

stateSaveParams: function (settings, data) {
data.myapp_token = token;
}

前缀 myapp_ 只是为了避免与 DataTable 自己的字段发生冲突。

我设置了stateLoadParams,这样如果token的当前值与之前记录的不同,状态就会被清除:

stateLoadParams: function (settings, data) {
if (data.myapp_token !== token) {
this.api().state.clear(); // Clears the state.
return false; // Tells DataTables to not use the state that was stored.
}

// This return is here to keep the IDE happy but does not do anything special.
return undefined;
},

在此示例中,我刚刚将 token 设置为我在问题 (privileged) 中显示的单一条件,但在生产中我使用了变量组合加上一个本地版本号,这样如果我做一些需要清除状态但不能像特权更改一样被检测到的事情,我可以根据需要增加 token 的值。

关于datatables - 如何防止 DataTables 根据过时的保存状态显示或隐藏列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26245150/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com