ExtJS 4.2: загрузить один элемент из удаленного хранилища

Итак, скажем, у меня есть магазин и в моей БД 20 000 000 строк. (также достаточно, чтобы я настроил размер страницы, чтобы я возвращал только 100 строк на страницу). Поскольку у меня установлен размер страницы, когда я делаю исходный вызов, я получаю только 100 элементов. Таким образом, следующее возвращает null:

Ext.getStore('MyLargeStore').getById(200); // returns null

Это имеет смысл для меня, поскольку технически магазин на стороне JS не имеет этого конкретного набора идентификаторов. Но можно ли как-то выполнить принудительный поиск, если этот идентификатор не существует? Из того, что я могу сказать, я уже сделал все «удаленное» и «автоматическое», что нужно в моем магазине:

Ext.define('MyApp.store.MyLargeStore', {
extend: 'Ext.data.Store',

requires: [
    'MyApp.model.MyLargeModel'
],

constructor: function(cfg) {
    var me = this;
    cfg = cfg || {};
    me.callParent([Ext.apply({
        autoLoad: true,
        autoSync: true,
        model: 'MyApp.model.MyLargeModel',
        remoteFilter: true,
        remoteSort: true,
        storeId: 'MyLargeModel',
        buffered: true,
        pageSize: 100
    }, cfg)]);
}
});

Есть ли способ заставить его тянуть с удаленного сервера, когда идентификатор не существует? Кажется, я не могу найти метод в документах (если только я его не упустил, поскольку их документы иногда трудно расшифровать =/)

Кроме того, я предполагаю, что вы всегда можете выполнить загрузку в хранилище, но я почти уверен, что если я загружу только эту 1 строку, то все другие места, где используется это хранилище, также будут иметь только эту строку (что я не обязательно хочу) Так что теоретически создание магазина на лету было бы моим единственным вариантом? Кажется, должен быть более простой способ, поэтому я решил спросить. должен быть какой-то лучший способ, чем создавать хранилище, а затем брать запись из этого нового хранилища...


person Aram Papazian    schedule 09.07.2013    source источник


Ответы (1)


То, что вы пытаетесь сделать здесь, - это неправильный подход к проблеме. Вам нужно вернуться к тому, для чего вам нужна эта строка, и сделать независимый вызов ajax на ваш сервер с идентификатором строки, которую вы пытаетесь найти. Затем сервер будет искать эту единственную строку в БД, а затем возвращать данные для создания модели для всего, для чего вам нужна строка. Эта логика должна выполняться независимо от хранилища.

person Reimius    schedule 09.07.2013
comment
Что я обычно и делаю (делаю боковой вызов ajax), но я предположил, что ExtJS каким-то образом сделает вызов для меня. Разве это не так, или я должен пройти через модель, чтобы сделать независимый звонок? (Или мне буквально нужно будет создать побочный вызов AJAX, чтобы получить единственную строку?) [Я пытаюсь сохранить все, что содержится в ExtJS/Architect, насколько это возможно, поэтому я пробую этот подход] - person Aram Papazian; 10.07.2013
comment
То, что вы пытаетесь сделать здесь, выходит за рамки того, для чего предназначен магазин. Я понимаю, где вы думаете, что эта функциональность может быть реализована на высоком уровне дизайна, но когда вы попадаете в код того, как магазин взаимодействует с сервером, он просто не предназначен для этого. - person Reimius; 10.07.2013
comment
Что я понимаю, но тогда мой вопрос меняется на то, будет ли лучше проходить через модель, или мне просто сделать ajax-вызов на мой сервер напрямую и получить данные оттуда? (PS Спасибо за помощь кстати =D) - person Aram Papazian; 10.07.2013
comment
Я недостаточно знаю о требованиях вашего проекта, чтобы принять такое решение, это действительно зависит от того, что лучше работает с тем, что вы делаете. Постарайтесь сделать лучший выбор с учетом ваших требований и того, где используются данные. Если данные нужно использовать во многих местах, предназначенных для использования модели, я бы сделал это так, если нет, то прямой вызов ajax был бы лучше, потому что он легкий. - person Reimius; 10.07.2013