eXTjS 3.3.1 LiveGrid store.each仅提供缓冲行

时间:2013-06-03 12:23:10

标签: extjs extjs3

我使用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);
}

2 个答案:

答案 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);
  }