我正在使用带有大量数据的jqgrid,因为过滤器耗时太长,我想在搜索之前显示一个对话框并在搜索后关闭它。
发生在我身上的事情是,当我在调试模式下运行过滤器时,我会看到打开和关闭对话框的方法在搜索之前和搜索之后被调用,但是当我运行过滤器时没有中断我可以看不到对话框,我的过滤器会等待10秒或更长时间来刷新表格,但对话框没有显示。
这是一个同步的问题吗?或者为什么我的对话框没出现?
这是我的代码:
jQuery("#mytable").jqGrid('filterToolbar',{
searchOnEnter : false,
stringResult : true,
defaultSearch:'cn',
beforeSearch: openDialogLoading,
afterSearch: closeDialogLoading
}
);
function openDialogLoading(){
$( "#DialogLoading" ).dialog({
resizable: false,
autoOpen: false,
height: 110,
width: 50,
title: 'Loading...',
modal: true,
bgiframe: true
});
$( "#DialogLoading" ).dialog('open');
}
function closeDialogLoading(){
if ($( "#DialogLoading" ).dialog('isOpen')) {
$( "#DialogLoading" ).dialog('close');
}
}
由于
答案 0 :(得分:1)
了解网格的详细信息(您使用的选项)非常重要。使用本地分页以获得具有大量行的良好性能非常重要。我为你创建了一些你可以尝试的演示以及加载/排序/过滤的时间:
你可以看到网格的性能取决于页面大小。您可以使用我使用的JSFiddle演示http://jsfiddle.net/OlegKi/1rmmyeLh/来播放更多列,行和页面大小的不同值
rowNum: 20
更新:您在评论中稍后发布的一些重要问题的演示http://jsfiddle.net/1rmmyeLh/7/。修改代码,使其显示" Loading"带有任何信息的gif非常容易,请参阅http://jsfiddle.net/OlegKi/1rmmyeLh/8/。
我在closeDialogLoading();
内部调用loadComplete
并修改了beforeSearch
,以便它返回true
而不是false
,这会阻止重新加载网格jqGrid的。另外,我手动触发reloadGrid
内的setTimeout
:
.jqGrid("filterToolbar", {
beforeSearch: function () {
var $self = $(this);
openDialogLoading();
setTimeout(function () {
$self.jqGrid("setGridParam", { search: true })
.trigger("reloadGrid", [{ page: 1 }]);
}, 0);
startTime = new Date();
measureTime = true;
return true; // SKIP filtering
}
})
这种代码修改解决了显示" Loading" DIV。另一方面,我坚持认为,你遇到的主要问题是使用本地数据分页(rowNum
选项)。
我想强调一点,在我看来,更好地使应用程序显示一些" Loading"按摩并保持缓慢的应用。您在演示rowNum: 4000
中使用了4000行数据。另一方面,我只能在显示器上看到35行数据。如果我只是将rowNum
从4000更改为30,我会看到性能提升大约20倍!现在你应该明确你的优先事项。人们可以长时间谈论非常愚蠢的用户难以理解寻呼机按钮的含义,但在我看来,20次性能的差异使得任何讨论都不需要。实际上,每个用户都已使用已有的寻呼机应用程序。所以我严格建议你使用本地数据分页。您将能够使用具有更大的数据集的样式(请参阅具有40000行和页面大小20的演示,在IE11中,责任更多为3倍,因为演示的责任是400行且没有分页)