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

如何防止DataTables根据过时的保存状态显示或隐藏列,datatables,local-storage,Datatables,Local Storage,我有一个由DataTables 1.10驱动的表。过滤已打开。当我在下面谈到“进行搜索”时,我指的是使用此表的过滤功能 问题的描述 关闭stateSave后一切正常。但是,当启用stateSave时,会发生以下情况: Alice以管理员身份登录。因为管理员拥有所有权限,当她搜索文章时,她可以看到所有文章。因为有些文章已发布,有些未发布,所以表中有一列显示哪些已发布,哪些未发布。到目前为止还不错 Bob是一个随机用户,访问该站点。随机用户无法看到未发布的文章,因此该表隐藏了显示发布状态的列。到目前

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

问题的描述 关闭
stateSave
后一切正常。但是,当启用
stateSave
时,会发生以下情况:

  • Alice以管理员身份登录。因为管理员拥有所有权限,当她搜索文章时,她可以看到所有文章。因为有些文章已发布,有些未发布,所以表中有一列显示哪些已发布,哪些未发布。到目前为止还不错

  • Bob是一个随机用户,访问该站点。随机用户无法看到未发布的文章,因此该表隐藏了显示发布状态的列。到目前为止还不错

  • 爱丽丝注销了。她现在像一个随机用户一样访问该网站。所以她应该看到鲍勃看到的东西。但是,当她进行搜索时,仍然会看到指示发布状态的列

  • 注意:我在这里讨论的问题纯粹是用户界面问题。服务器确保未经授权的用户永远无法获取未发布文章的记录。但问题是,附加列提供了未经授权的用户不需要的信息。他们只能在搜索中看到已发布的文章他们不需要看到他们在搜索中得到的每一篇文章都被发布。)

    配置datatable的代码通过执行以下操作隐藏发布列:

    var columnDefs = [];
    if (!privileged) {
        columnDefs.push({
            targets: [1],
            orderable: false,
            visible: false
        });
    }
    
    columnDefs
    作为
    columnDefs
    选项传递给数据表

    问题的技术原因 问题在于,数据表将列可见性之类的内容存储到它保存到
    localStorage
    的状态中。因此,当Alice注销并以非特权用户身份再次进行搜索时,即使
    columnDefs
    的值正确,它也会被保存的状态覆盖作为管理员,它声明publication列是可见的,因此即使Alice以非特权用户的身份访问站点,它仍然可见

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

    注意事项:

  • 我不想使用
    sessionStorage
    ,因为我想在浏览器关闭之间保持状态,但是
    sessionStorage
    在浏览器关闭时被清除

  • 我无法使用服务器分配的会话cookie检测登录和注销,因为它仅限于HTTP。此外,权限可能会因其他原因而更改

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


  • 我已经确定的解决方案是在保存的数据中使用一个附加字段,以了解我关心的条件何时发生了变化。这个字段的值根据用户当前拥有的权限而变化。例如,因为在我在这里描述的情况下,我决定根据名为
    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; 
    },
    

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

    回答得很好!!!!它实际上帮助了我:特别是因为我正在计划几个增量部署和以下是我需要“重置”用户保存状态的时间和不需要的时间:这都是更改令牌的问题。谢谢!