Вопрос

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

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

Это было полезно?

Решение

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

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

РЕДАКТИРОВАТЬ:Чтобы уточнить, каждому магазину потребуется отдельный root свойство (что вы уже делаете), чтобы каждый из них получил нужные данные.

{
   "firstRoot": [...],
   "secondRoot": [...],
   "thirdRoot": [...]
}

Другие советы

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

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

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

Другой фантастический способ - использовать 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);

        }
    });

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top