我使用ExtJs 3.3.1,因为许多扩展在4.xx下不起作用 其中一个扩展是LiveGrid。 我不能尝试,但我想在4.x缓冲网格中发生了类似的事情。 当我对网格中可见的行进行报告时,仅返回缓冲的行,我重新定位当前记录,但其余记录的加载仅在报告完成后发生。我如何获得所有记录?
在按钮处理程序中,我调用toReport(grid)。
toReport = function(grid){
var store = grid.getStore();
var view = grid.getView();
store.each(function(record) {
Ext.defer(function(){
index = readRow(store, record);
if (index % 10 == 0){
view.focusRow(index);
}
}, 500, this);
});
console.log(output)
}
readRow = function(store, record){
output = "";
for (var xlCol=1;xlCol<record.fields.length+1;xlCol++){
var veld = store.fields.itemAt(xlCol-1).name;
waarde = record.get(veld);
if (realTypeOf(waarde)==="date"){
output += waarde.format("d-m-Y");
}else{
output += record.get(veld);
}
}
console.log(store.indexOf(record)+ " " + output);
return store.indexOf(record);
}
答案 0 :(得分:1)
网格需要操纵其商店过滤器,分类器,分页等,以获取它想要显示的记录。商店本身只在内存中保存与其过滤器匹配的记录子集等。这就是商店在Ext中设计的方式:它们旨在限制为一个且只有一个视图。
我认为在您的情况下,最简单的解决方案是创建具有类似配置的另一个商店,并将其load
方法与params一起使用,以便获得所有记录。
如果您不愿意触发多个检索基本相同数据的请求,请查看Ext.data.Proxy
。与存储不同,代理不绑定到特定视图或任务,并且可以在多个存储实例之间共享。因此,理论上,您可以创建一个代理,一次请求来自服务器的所有记录,然后将它们的一部分提供给多个商店。为此,您必须实现代理的doRequest
方法(或者很可能覆盖您已经使用的代理之一)。
答案 1 :(得分:0)
我确实通过使用递归找到了解决方案。 像这样,视图可以跟上枚举。
Ext.toExcel = function(grid){
var store = grid.getStore();
var view = grid.getView();
readRow(store, view, 0);
}
readRow = function(store, view, index){
output = "";
record = store.getAt(index);
for (var xlCol=1;xlCol<record.fields.length+1;xlCol++){
var veld = store.fields.itemAt(xlCol-1).name;
waarde = record.get(veld);
if (realTypeOf(waarde)==="date"){
output += waarde.format("d-m-Y");
}else{
output += record.get(veld);
}
}
//console.log(index+ " " + output);
if (index % 50 == 0){view.focusRow(index);}
Ext.defer(function(){
if (index < store.totalLength){
readRow(store, view, index+1);
}
}, 100, this);
}