2010-07-18 110 views
27

我目前遇到了用新參數重新加載json商店的麻煩。這是我的店:用新參數重新加載json商店ExtJs Ext.data.JsonStore

newsletters = new Ext.data.JsonStore({ 
     url: '/newsletters/', 
     root: 'results', 
     fields: [ 
      'id', 
      'body' 
      'recipients' 
     ], 
     baseParams: { command: 'json', to: dateTo, from: dateFrom }, 
    autoLoad: true 
    }); 

dateTo和dateFrom是initally空字符串(「」),並在Firebug檢查/通訊時調用正確的參數。

現在沒有以下卡瑪森工作:

更改dateTo和dateFrom的值,然後調用newsletters.reload()調用仍然與參數的頁面,並從爲空字符串。

調用newsletters.reload({ to: 'test1', from: 'test2' });仍然將參數視爲空字符串。

最後從手動我曾嘗試:

lastOptions = newsletters.lastOptions; 
Ext.apply(lastOptions.params, { 
    to: 'test1', 
    from: 'test2' 
}); 
newsletters.reload(lastOptions); 

這再次不請求/更新的參數通訊。

任何意見讚賞!

+0

我不知道,如果它的關鍵或不..但是你錯過了','body''在'fields' – Lipis 2011-01-11 21:17:44

回答

5

從文檔,你也許可以這樣做:

store.setBaseParam('to', dateTo); 

現在,如果我理解正確的話,你希望每當dateTo和dateFrom改變改變你的baseParams。

你可以嘗試:

var dateTo = '', dateFrom = ''; 

store.on('beforeload', function(s) { 
    s.setBaseParam('to', dateTo); 
    s.setBaseParam('from', dateFrom); 
}); 

// This should work : 
dateTo = 1; 
dateFrom = 2; 
store.load(); 
29

實際上,你可以通過params對象的load()方法

newsletters.load({ 
    params: {to: 'test1', from: 'test2'} 
}) 
+0

+1,尋找答案後'' 。 – 2013-05-16 07:17:46

4

我的問題是:我有一個商店,將通過代理請求數據後端。這個請求應該包含一個名爲filter的參數,這個參數只會幫助後端決定客戶端感興趣的結果集。這個參數是從Combobox或其他用戶可以用來表示哪個過濾器的組件加載的。應使用。

從我的角度來看,不應將參數設置爲Store,也不要使用load參數。我將解釋爲什麼:

  1. 將參數配置到存儲區意味着使用相同存儲區的每個其他組件都將配置此參數,這意味着您可能會遇到併發問題。
  2. 而在第二種情況下,通過加載方法對其進行配置並不令人感興趣,因爲您不希望每次都明確使用load方法,請記住已經有一些組件像分頁以及觸發此方法的自定義組件。

什麼是從我的觀點來看,正確的方法:

每一個load被觸發的時候,我們只是附加其他參數以非侵入性的方式。這意味着觸發器不需要有任何改變(請記住這裏觸發器可以是執行store.load()的任何組件),並且存儲器不應該知道這個新參數。

你可以清楚地看到這裏應該是在請求代理數據之前完成的一個操作,在我的情況下,我是作爲beforeload事件的一個監聽器來實現的。當執行beforeload時,我只是將新參數聚合到根據documentation的偵聽器的操作參數是:beforeload(store, operation, eOpts)。最終的實現是一樣的東西:

store.on({ 
    beforeload: function (store, operation, opts) { 
     Ext.apply(operation, { 
      params: { 
       filterName: Ext.getCmp('filterCombo').getValue() 
      } 
     }); 
    } 
});