如何告诉商店加载了哪个页面

时间:2011-09-21 11:30:57

标签: javascript extjs extjs4

我有一个绑定到网格的商店。加载时它有n页。

现在我想显示包含特定值的页面。为了做到这一点,我使用store.load({params: {'file': 'file33939'}});(使用'文件',因为网格显示文件列表,但它与问题无关)。此刻我不知道应该是什么页面。回复如下:

{
  "files":[{"id":"33939", "name": "file33939"}, /* ... */],
  "total": 1000,
  "page": 13
}

网格显示正确的数据(真正包含'file33939'的页面)。但是, pagingtoolbar 网格的rownumberer store.indexOfTotal()的行为就像加载了第一页(而不是13)一样。

如何“告诉”商店刚刚加载的页面是13?

2 个答案:

答案 0 :(得分:2)

要更改已加载的页面,请不要使用store.load()。您应该找到一种方法来获取给定数据的页码(例如,通过ajax请求询问服务器),然后通过pagingtoolbar.move(pageNumber)更新页面。这将更新您的pagingtoolbar以及网格和商店,一切都保持同步。

答案 1 :(得分:0)

我找到了合适的解决方案。这不是最优雅的解决方案。无论如何。

在深入查询代码后,我发现 pagingtoolbar store.indexOfTotal()正在使用record.index(在我的情况下设置为第一页已加载)。 record.index由函数store.loadRecords中的商店设置:

loadRecords: function(records, options) {
    // ...
    //FIXME: this is not a good solution. Ed Spencer is totally responsible for this and should be forced to fix it immediately.
    for (; i < length; i++) {
        if (options.start !== undefined) {
            records[i].index = options.start + i;

        }
    // ...
},

FIXME评论不是我的。它在代码中。

理想的解决方案是在响应来之后和调用loadRecords之前找到一个被触发的事件,并在处理程序中覆盖options。但是我没有找到这样的事件。

但是你总是可以覆盖loadRecords:

Ext.define('MyApp.store.MyStore', {
    extend          : 'Ext.data.Store',
    // ...
    loadRecords     : function(records, options) {
        if (this.proxy.reader.rawData.page) {
            var page = this.proxy.reader.rawData.page;

            // This is for pagingtoolbar
            this.currentPage = page;

            // The following is for rownumberer and correct index behaviour
            options.page = page;
            options.start = (page-1)*options.limit;
        }
        this.callParent(arguments);
    },
    // ...
});
相关问题