如何防止DataTables根据过时的保存状态显示或隐藏列
我有一个由DataTables 1.10驱动的表。过滤已打开。当我在下面谈到“进行搜索”时,我指的是使用此表的过滤功能 问题的描述 关闭如何防止DataTables根据过时的保存状态显示或隐藏列,datatables,local-storage,Datatables,Local Storage,我有一个由DataTables 1.10驱动的表。过滤已打开。当我在下面谈到“进行搜索”时,我指的是使用此表的过滤功能 问题的描述 关闭stateSave后一切正常。但是,当启用stateSave时,会发生以下情况: Alice以管理员身份登录。因为管理员拥有所有权限,当她搜索文章时,她可以看到所有文章。因为有些文章已发布,有些未发布,所以表中有一列显示哪些已发布,哪些未发布。到目前为止还不错 Bob是一个随机用户,访问该站点。随机用户无法看到未发布的文章,因此该表隐藏了显示发布状态的列。到目前
stateSave
后一切正常。但是,当启用stateSave
时,会发生以下情况:
var columnDefs = [];
if (!privileged) {
columnDefs.push({
targets: [1],
orderable: false,
visible: false
});
}
columnDefs
作为columnDefs
选项传递给数据表
问题的技术原因
问题在于,数据表将列可见性之类的内容存储到它保存到localStorage
的状态中。因此,当Alice注销并以非特权用户身份再次进行搜索时,即使columnDefs
的值正确,它也会被保存的状态覆盖作为管理员,它声明publication列是可见的,因此即使Alice以非特权用户的身份访问站点,它仍然可见
我想让用户从保存状态中受益,但避免在用户权限更改时保留此状态
注意事项:
sessionStorage
,因为我想在浏览器关闭之间保持状态,但是sessionStorage
在浏览器关闭时被清除我已经确定的解决方案是在保存的数据中使用一个附加字段,以了解我关心的条件何时发生了变化。这个字段的值根据用户当前拥有的权限而变化。例如,因为在我在这里描述的情况下,我决定根据名为
priviledged
(根据服务器提供的数据初始化)的变量,可以简单如下:
var token = privileged;
然后我设置stateSaveParams
以在保存状态时记录令牌:
stateSaveParams: function (settings, data) {
data.myapp_token = token;
}
前缀myapp\uuu
就是为了避免与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;
},
我刚刚将
令牌
设置为我在问题中显示的单个条件(特权
)在本例中,但在生产中,我使用了一组变量加上一个本地版本号,这样,如果我做了一些需要清除状态但无法检测到的事情,就可以根据需要增加令牌的值。回答得很好!!!!它实际上帮助了我:特别是因为我正在计划几个增量部署和以下是我需要“重置”用户保存状态的时间和不需要的时间:这都是更改令牌的问题。谢谢!