使用新参数ExtJs Ext.data.JsonStore重新加载json存储

时间:2010-07-18 23:35:45

标签: json extjs

我目前无法使用新参数重新加载json商店。这是我的商店:

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

dateTo和dateFrom是最初为空的字符串(''),并使用正确的参数调用firebug / newsletters。

现在没有以下技术工作:

更改dateTo和dateFrom的值然后调用newsletters.reload()仍调用带有和来自空字符串的参数的页面。

调用newsletters.reload( { to: 'test1', from: 'test2' } );仍然会将参数视为空字符串。

最后从我尝试过的手册开始:

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

这再次没有使用更新的参数请求/简报。

任何建议表示赞赏!

3 个答案:

答案 0 :(得分:29)

您实际上可以将params对象传递给load()方法

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

答案 1 :(得分: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();

答案 2 :(得分:4)

我的问题是:我有一个商店,它将通过代理请求数据到后端。此请求应包含一个名为filter的参数,该参数将仅帮助后端确定客户端感兴趣的结果集合。此参数从Combobox或其他某个组件加载用户可以用来表示应该使用哪个过滤器。

从我的角度来看,参数不应该设置为Store,也不能使用load参数。我将解释原因:

  1. 为商店配置参数意味着使用同一商店的每个其他组件都会配置此参数,这意味着您可能会遇到并发问题。
  2. 在第二种情况下,将其配置为over load方法是没有意思的,因为你不希望每次都明确地使用你自己的load方法,记住已经有了一些组件,如分页和触发此方法的自定义组件。
  3. 从我的角度来看,正确的方法是什么:

    每次触发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()
                }
           });
        }
    });