ExtJS: несколько JsonStores из одного вызова AJAX? - PullRequest
3 голосов
/ 26 октября 2009

У меня есть приложение на основе ExtJS. При редактировании объекта появляется окно ExtJS с несколькими вкладками. Три из этих вкладок имеют Ext GridPanels, каждая из которых отображает различные типы данных. В настоящее время каждый GridPanel имеет свой собственный JsonStore, то есть всего четыре AJAX-запроса к серверу - один для javascript для создания окна и один для каждого из JsonStores. Есть ли способ, чтобы все три JsonStores могли читать с одного вызова AJAX? Я могу легко объединить все данные JSON, каждый из которых в настоящее время имеет свое свойство root.

Редактировать : это Ext 2.2, а не Ext 3.

Ответы [ 5 ]

3 голосов
/ 07 ноября 2009

Объект javascript, созданный из ответа JSON, доступен в yourStore.reader.jsonData при запуске события магазина load. Например:

yourStore.on('load', function(firstStore) {
   var data = firstStore.reader.jsonData;
   otherStore.loadData(data);
   thirdStore.loadData(data);
}

EDIT: Чтобы уточнить, каждому магазину потребуется отдельное свойство root (что вы уже делаете), чтобы каждый получал нужные данные.

{
   "firstRoot": [...],
   "secondRoot": [...],
   "thirdRoot": [...]
}
3 голосов
/ 26 октября 2009

Вы можете получить JSON напрямую с помощью AjaxRequest, а затем передать его в метод loadData () каждого JSONStore.

1 голос
/ 26 октября 2009

Вы можете сделать это, используя Ext.Direct, где вы можете сделать несколько запросов за одно соединение.

0 голосов
/ 10 ноября 2015

Другой фантастический способ - использовать Ext.Data.Connection () , как показано ниже:

var conn = new Ext.data.Connection();
    conn.request({
        url: '/myserver/allInOneAjaxCall',
        method: 'POST',
        params: {
           // if you wish too
        },
        success: function(responseObj) {
            var json = Ext.decode(responseObj.responseText);

           yourStore1.loadData(json.dataForStore1);
           yourStore2.loadData(json.dataForStore2);            

        },
        failure: function(responseObj) {
            var message = Ext.decode(responseObj.responseText).message;
            alert(message);

        }
    });

Это сработало для меня.

0 голосов
/ 05 ноября 2009

Может быть, вам поможет HTTP-кеширование. Объедините ваши данные json, убедитесь, что ваши JsonStores используют GET, и посмотрите Firebug, чтобы убедиться, что 2-й и 3-й запросы не отправляются на сервер. Возможно, вам понадобится установить заголовок с истекшим сроком давности в этом ответе json, что может быть бесполезно, если вы ожидаете, что данные будут часто меняться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...