2011-09-21 84 views
1

我有一個綁定到網格的商店。當它被加載時,它有n個頁面。如何判斷商店加載了哪個頁面

現在我想顯示包含特定值的頁面。爲了做到這一點,我使用store.load({params: {'file': 'file33939'}});(使用'文件'是因爲網格顯示文件列表,但它與問題無關)。在這一刻,我不知道它應該是什麼頁面。答案如下:

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

網格顯示正確的數據(真正包含'file33939'的頁面)。但分頁工具欄,網格的rownumbererstore.indexOfTotal()的行爲就好像第一頁加載(而不是13)。

我該如何「告訴」商店剛纔加載的商店頁面是13?

回答

2

要更改加載的頁面,請不要使用store.load()。您應該找到一種方法來獲取給定數據的頁碼(例如,通過ajax請求詢問服務器),然後通過pagingtoolbar.move(pageNumber)更新頁面。這將更新您的分頁工具欄以及網格和商店,並且所有內容都保持同步。

+0

謝謝您的回答。我知道這個解決方案。不過,我只需要使用一個請求就可以完成(由於某些情況)。爲了縮小可能的解決方案列表,我應該說通過ajax加載然後使用'store.loadData()'也不是一個選項。以及使用'proxy.directFn'在前端模擬服務器端。無論如何,+1,因爲你的回答是正確的。 –

0

我找到了合適的解決方案。這不是最優雅的解決方案。然而,它的工作。

在煎茶代碼挖​​後我發現,pagingtoolbarstore.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); 
    }, 
    // ... 
}); 
相關問題