jQuery DataTables 使用 ext.search.push() 和 pop()

问题描述

我正在处理一个 jQuery 数据表,我想在其中包含多个自定义搜索,但是当我尝试更改原始搜索时遇到了奇怪的行为。

我正在使用 $.fn.dataTable.ext.search.push(function(settings,data,dataIndex) 根据文档添加新的搜索条件。

此外,我正在使用 $.fn.dataTable.ext.search.pop(); 清除上次搜索

最后,我使用会话来控制弹出行为。基本上,只有在用户进行全新的选择并且已经有一个存储的选择开始时才允许弹出。

我对上述方法的理解是 push 添加搜索条件,pop 删除最后应用的 push。我遇到的问题是,当应用多次推送时,pop 最终会删除错误的推送。

例如,使用下面小提琴中的代码。如果用户从所有 3 个过滤器(用户、类型、额外)中选择一个选项,一切都会按预期工作。

但是,一旦用户返回到其他过滤器类别并进行选择更改,内存中的推送堆栈最终会根据用户选择调用错误的推送顺序。

在小提琴示例中尝试以下操作,您就会明白我的意思。

  1. 应用用户过滤器“user1”
  2. 应用类型过滤器“type1”
  3. 应用额外的过滤器“content1”
  4. 返回用户过滤器并更改为“user2”(在此处查看控制台日志并查看下面的说明)
  5. 再次将用户过滤器更改为“user1”

这个特定搜索的最终结果是额外的过滤器似乎丢失了。

我使用控制台日志来帮助我了解这里发生了什么。根据我在搜索 #4 中的观察结果,首先调用 pop 。这是因为选择“user2”与搜索#1 中存储的会话“user1”不同。我相信 pop 正在取消应用已应用的“content1”过滤器是搜索 #3。我打算发生的是取消应用过滤器“user1”,以便“user2”可以替换它。

一旦我的代码搜索 #4 中推送,您可以在控制台日志中看到它推送“user1”(而不是“user2”)然后推送“type1”(来自内存)但没有推送“content1”。

我怀疑这是导致此问题的代码区域,但我不知道如何修复它:

      var sessionUser = sessionStorage.getItem('userFilter');
      console.log("session user is: "+sessionUser);
      if(sessionUser){
        if(sessionUser !== selectedUser){
            console.log("pop user SESSION");
            $.fn.dataTable.ext.search.pop();
        }else{
          console.log("NO user PUSHES");
          return;
        }
      }

似乎可行的修复方法是,是否可以使用某种索引进行弹出,但我还没有看到任何有关如何执行此操作的文档。想知道是否有人之前遇到过此类问题并提出了更好的解决方案?

JSfiddlehttps://jsfiddle.net/j98a0x76/

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)