Ext JS 存储在应缓冲数据时意外重新加载数据

Posted

技术标签:

【中文标题】Ext JS 存储在应缓冲数据时意外重新加载数据【英文标题】:Ext JS store unexpectedly reloads data when it should be buffered 【发布时间】:2014-04-24 17:43:00 【问题描述】:

我们正在尝试解决这个例子: http://dev.sencha.com/deploy/ext-4.0.1/examples/grid/buffer-grid.html

例如在店里:

// create the Data Store
var store = Ext.create('Ext.data.Store', 
    id: 'store',
    pageSize: 50,
    // allow the grid to interact with the paging scroller by buffering
    buffered: true,
    // never purge any data, we prefetch all up front
    purgePageCount: 0,
    model: 'ForumThread',
    proxy: 
        type: 'memory'
    
);

//and in the grid:
...
store: store,
verticalScroller: 
    xtype: 'paginggridscroller',
    activePrefetch: false
,
loadMask: true,
...

但是当我们滚动过去网格中的 pageSize 记录时,我们会出现长时间的停顿,这不仅仅是呈现下一组记录——存储本身正在从我们的 Web 服务重新加载数据。调用我们的 Web 服务会加载所有数据,我们不希望它在用户滚动时重新加载。我们希望 RENDERING 被缓冲,而不是数据加载,就像示例中所说的“他的示例说明了预先加载所有记录并缓冲渲染”。主要是因为我们希望避免此时将排序和排序转移到服务器,同时也是为了提高性能。然而,我们也不希望立即渲染所有内容,因为这会导致 IE8 中可怕的长时间运行的 javascript 错误。关于什么可能导致商店在此模式下重新查询数据源的任何想法?

【问题讨论】:

【参考方案1】:

如果您希望加载所有记录并且只缓冲渲染,那么您需要在商店中设置buffered:false,并且您需要使用buffered grid view renderer。

【讨论】:

【参考方案2】:

您可以在页面加载 (allRecordStore) 时将所有记录加载到一个存储中,但使用另一个存储用于填充来自 allRecordStore 的记录的网格 (gridStore),并在用户处于通过网格进行分页。

您可以在网格的 PagingToolBar 上使用beforechange 侦听器(附加到其bbar 配置选项)。

在此侦听器中,您可以执行以下操作:

//you've probably have already shown items 0,19 when the page loaded        
var items = allRecords.getRange(20, 40); 
gridRecords.load(items);

显然,您需要通过查看page 参数的变量start 来实现一个逻辑来跟踪索引(是用户查看记录 80 到 100、20 到 40 等) beforechange 监听器。 start 是我在我的商店的配置选项paramNames 中选择的名称

我就是这样做的,但我的大部分经验还是使用 3.x,也许有更简单的方法来使用 4.x

【讨论】:

弗朗西斯,这听起来很有希望。你知道任何可以指向我的示例代码吗?谢谢 @Luther 您使用的是哪个 ExtJS 版本?或许咲希的回答毕竟更合适。 dev.sencha.com/deploy/ext-4.0.1/examples/grid/buffer-grid.html 我们正在使用 4.1,如果它可以帮助解决这个问题,我们正在研究 4.2 我认为我们将再次尝试这种方法。我们在网格上进行了排序,这增加了复杂性。

以上是关于Ext JS 存储在应缓冲数据时意外重新加载数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一页面的事件中重新加载或刷新一个页面的存储数据

如何在 ext js 4.1 中重新加载商店?

Ext JS 4 存储加载回调

希望让 EXT JS 视图自动重新加载

系统重装后,Mysql数据库重装加载原来数据库

ext里面的下拉框怎么在每次打开之前都重新加载一遍新数据?