如何判断商店加载了哪个页面
问题描述:
我有一个绑定到网格的商店。当它被加载时,它有n个页面。如何判断商店加载了哪个页面
现在我想显示包含特定值的页面。为了做到这一点,我使用store.load({params: {'file': 'file33939'}});
(使用'文件'是因为网格显示文件列表,但它与问题无关)。在这一刻,我不知道它应该是什么页面。答案如下:
{
"files":[{"id":"33939", "name": "file33939"}, /* ... */],
"total": 1000,
"page": 13
}
网格显示正确的数据(真正包含'file33939'的页面)。但分页工具栏,网格的rownumberer和store.indexOfTotal()的行为就好像第一页加载(而不是13)。
我该如何“告诉”商店刚才加载的商店页面是13?
答
要更改加载的页面,请不要使用store.load()
。您应该找到一种方法来获取给定数据的页码(例如,通过ajax请求询问服务器),然后通过pagingtoolbar.move(pageNumber)
更新页面。这将更新您的分页工具栏以及网格和商店,并且所有内容都保持同步。
答
我找到了合适的解决方案。这不是最优雅的解决方案。然而,它的工作。
在煎茶代码挖后我发现,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);
},
// ...
});
谢谢您的回答。我知道这个解决方案。不过,我只需要使用一个请求就可以完成(由于某些情况)。为了缩小可能的解决方案列表,我应该说通过ajax加载然后使用'store.loadData()'也不是一个选项。以及使用'proxy.directFn'在前端模拟服务器端。无论如何,+1,因为你的回答是正确的。 –