Подтвердить что ты не робот

Перезагрузка json-магазина с новыми параметрами ExtJs Ext.data.JsonStore

В настоящее время у меня возникают проблемы с перезагрузкой 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);

Это снова не запрашивает/бюллетени с обновленными параметрами.

Любые советы оценены!

4b9b3361

Ответ 1

Фактически вы можете передать объект params методу load()

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

Ответ 2

Из документов вы, вероятно, можете сделать:

store.setBaseParam('to', dateTo);

Теперь, если я правильно понял, вы хотите, чтобы ваши 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();

Ответ 3

Моя проблема: у меня есть магазин, который должен запрашивать данные через прокси-сервер для резервного копирования. Этот запрос должен содержать параметр с именем filter, который просто поможет серверу решить, какой набор результатов интересует клиент. Этот параметр загружается из Combobox или какого-либо другого компонента, который пользователь может использовать чтобы указать, какой фильтр использовать.

С моей точки зрения, параметры не должны устанавливаться в хранилище и не использовать параметр загрузки. Я объясню, почему:

  • Настройка параметров в хранилище будет означать, что каждый другой компонент, использующий один и тот же магазин, будет иметь эти параметры, что означает, что у вас могут возникнуть проблемы совпадения.
  • А во втором случае не интересно настраивать его по методу загрузки, потому что вы не хотите, чтобы каждый раз явным образом использовал метод load самостоятельно, помните, что уже есть некоторые компоненты как пейджинг и пользовательские компоненты, которые запускают этот метод.

Каким будет правильный путь с моей точки зрения:

Каждый раз, когда срабатывает a load, мы просто добавляем дополнительный параметр неинтрузивным способом. Это означает, что триггер не нуждается в каких-либо изменениях (помните, что триггер может быть любым компонентом, который выполняет store.load()), и магазин не должен знать об этом новом параметре.

Здесь вы можете ясно видеть, что это должна быть операция, выполняемая перед запросом на прокси-сервер, и в моем случае я реализован как слушатель для события beforeload. Когда выполняется beforeload, я просто агрегирую новые параметры с параметром операции слушателя, который согласно документации: beforeload( store, operation, eOpts ). Окончательная реализация - это что-то вроде:

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