本地数据集上jqgrid triggerToolbar的替代方法

本地数据集上jqgrid triggerToolbar的替代方法,jqgrid,filter,local,reload,Jqgrid,Filter,Local,Reload,我有一个jqgrid显示大量数据。通过jqueryajax调用(在jqgrid逻辑之外)定期从服务器检索数据。检索到的数据将与之前检索到的数据进行比较(并作为var存储在js中,作为jqgrid的数据)。如果它们不同,则刷新本地数据,然后触发jqgrid重新加载。jqgrid数据类型是jsonstring 这个解决方案运行得很好,除非用户在“过滤器”工具栏中有一个过滤器值。因为我在loadcomplete事件中设置了一个0.1秒的计时器来触发筛选器,所以当存在筛选器字符串时,整个网格刷新如下所示

我有一个jqgrid显示大量数据。通过jqueryajax调用(在jqgrid逻辑之外)定期从服务器检索数据。检索到的数据将与之前检索到的数据进行比较(并作为var存储在js中,作为jqgrid的数据)。如果它们不同,则刷新本地数据,然后触发jqgrid重新加载。jqgrid数据类型是jsonstring

这个解决方案运行得很好,除非用户在“过滤器”工具栏中有一个过滤器值。因为我在loadcomplete事件中设置了一个0.1秒的计时器来触发筛选器,所以当存在筛选器字符串时,整个网格刷新如下所示:

  • jqgrid中最初显示了20条记录(因为用户正在筛选列中的某个值)
  • jqgrid被刷新,因为通过单独的ajax调用从服务器轮询的数据与存储在浏览器中的数据不同
  • jqgrid将在很短的时间内显示所有新数据
  • jqgrid筛选器在loadcomplete内触发。屏幕上又显示了20条记录
从技术上讲,它仍在工作。但是,在网格可视化之前,有没有办法在jsonstring上本地重新应用过滤器?换一种方式,jqgrid能否只可视化一次,这将同时加载新的JSONSTANG和应用之前放置在过滤器盒中的过滤器

谢谢 卡斯比

更新:

我尝试了Oleg的一个解决方案,在重新加载网格时应用过滤器。这是。只要数据类型是本地的,它就可以完美地工作。我的页面实际上使用数据类型jsonstring来重新加载网格。代码中的这个函数似乎确实适用于jsonstring。我希望在外部jqueryajax成功地从服务器检索到数据后调用这样一个函数

function filter() {
            var searchFiler = $("#filter").val(), f;

            if (searchFiler.length === 0) {
                grid[0].p.search = false;
                $.extend(grid[0].p.postData,{filters:""});
            }
            f = {groupOp:"OR",rules:[]};
            f.rules.push({field:"name",op:"cn",data:searchFiler});
            f.rules.push({field:"note",op:"cn",data:searchFiler});
            grid[0].p.search = true;
            $.extend(grid[0].p.postData,{filters:JSON.stringify(f)});
            grid.trigger("reloadGrid",[{page:1,current:true}]);
        }

有人能帮我吗?非常感谢。

数据类型:“本地”
相比,
数据类型的用法:“jsonstring”
有一些细微的差别。您可以比较代码的相应部分。
datatype的代码差异之一:“local”
是使用了
addLocalData
populateVisible
函数。最后一个功能(
populateVisible
)仅在虚拟滚动(
scroll:1
scroll:true
)的情况下使用。在您的情况下,
datatype:“jsonstring”
datatype:“local”
之间的重要区别是在
datatype:“local”
的情况下调用
addLocalData

函数
addLocalData
应用本地数据的分组和筛选(请参阅)。此外,它还将显示的行列表剪切到当前页面(请参阅)

因此,如果服务器返回未过滤的数据,并且需要显示过滤后的数据,那么应该使用
datatype:“local”
而不是
datatype:“jsonstring”
。您应该使用
data
而不是
datastr
。您可以使用
localReader
而不是
jsonReader
(请参阅),或者只需手动将服务器返回的数据转换为默认情况下可以读取的格式
localReader

更新:在中,我描述并包括了演示如何使用
localReader

您也可以将从服务器返回的输入数据转换为标准格式(或以标准格式从服务器返回数据)。
data
参数应该是命名对象的数组,其属性类似于
colMode
中的列名。因此,您可以做的只是通过
数组进行一个简单的循环,然后以jqGrid所需的格式创建另一个数组。相应的代码可能与以下内容有关:

//让我们将myImput与myImput.rows一起使用
//这里有cm,用作colModel参数的值
var mydata=[],input=myImput.rows,l=input.length,
cmLength=cm.长度,i,j,输入项,项目;
对于(i=0;i

在这种转换之后,您可以使用
mydata
array作为
data
参数的值。

谢谢您的详细解释。我不得不承认。Tony在创建jqgrid方面做得很好,但我通过阅读您的文章了解了更多关于jqgrid的信息。我一直尝试使用datatype local来处理从服务器轮询的数据,但网格总是呈现为空白。我无法想象文档中的默认localreader将如何工作。在所有dataype本地示例中,我只能看到包含列字段值数组的数组。但是默认的localReader需要格式{root:“rows”、page:“page”、total:“total”、records:“records”、repeatitems:false、cell:“cell”、id:“id”}。除了repeattimes之外,它与jsonreader相同。我遗漏了什么吗?@casbby:发布服务器返回的数据示例不容易吗?包括定义jqGrid的代码可以清除其他打开的问题。如果我猜您可以尝试使用
datatype:“local”,data:mydata,localReader:{repeatitems:false}
而不是
datatype:“jsonstring”,datastr:mydata
我从源代码中查看了addlocadata函数,它看起来很像eyeah。我从服务器上轮询的数据大致如下“{”页“:“1”,“总计”:1,“记录”:“1”,“行”:[{”id“:“1”,“单元格”:[“v1”,“v2”,“v3”,“v4”]},{”id“:“2”,“单元格”:[“v1”,“v2”,“v3”,“v4”]},}”。我从源代码中查看了addlocaldata函数。它所做的第一件事是'if(!$.isArray(ts.p.data)){return;}'所以mydata可以