如何解决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 个过滤器(用户、类型、额外)中选择一个选项,一切都会按预期工作。
但是,一旦用户返回到其他过滤器类别并进行选择更改,内存中的推送堆栈最终会根据用户选择调用错误的推送顺序。
在小提琴示例中尝试以下操作,您就会明白我的意思。
- 应用用户过滤器“user1”
- 应用类型过滤器“type1”
- 应用额外的过滤器“content1”
- 返回用户过滤器并更改为“user2”(在此处查看控制台日志并查看下面的说明)
- 再次将用户过滤器更改为“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;
}
}
似乎可行的修复方法是,是否可以使用某种索引进行弹出,但我还没有看到任何有关如何执行此操作的文档。想知道是否有人之前遇到过此类问题并提出了更好的解决方案?
JSfiddle:https://jsfiddle.net/j98a0x76/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。