2010-07-18 99 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() 
      } 
     }); 
    } 
});