0

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

2 回答 2

1

网格需要操作其存储过滤器、排序器、分页等,以获取它想要显示的记录。存储本身仅在内存中保存与其过滤器匹配的记录子集等。这就是存储在 Ext 中的设计方式:它们旨在被限制到一个且只有一个视图。

我认为在您的情况下,最简单的解决方案是创建另一个具有类似配置的商店,并将其load方法与参数一起使用,以便您获取所有记录。

如果您不愿触发多个请求以检索基本相同的数据,请查看Ext.data.Proxy. 与商店不同,代理不绑定到特定的视图或任务,并且可以在多个商店实例之间共享。因此,理论上,您可以创建一个代理,一次从服务器请求所有记录,然后将其中的一部分提供给多个商店。为此,您必须实现doRequest代理的方法(或者很可能覆盖您已经在使用的代理之一)。

于 2013-06-03T12:39:14.743 回答
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);
  }
于 2013-06-05T12:58:04.860 回答