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

Как получить массив данных JSON из магазина ExtJS

Есть ли способ, позволяющий мне вернуть мои сохраненные данные в Grid Panel ExtJS точно так, как я его загрузил, используя:

var data = ["value1", "value2"]
Store.loadData(data);

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

Думаю, я ищу что-то вроде этого:

var data = Store.getData();
//data = ["value1", "value2"]

после того, как все сказано и сделано. Или есть другой способ обновить сетку новыми данными, о которых я не знаю. Даже использование прокси-сервера по-прежнему использует "оригинальные" данные, а не новый магазин.

4b9b3361

Ответ 1

Store.getRange(), похоже, именно то, что вы ищете. Он вернет вам Ext.data.Record[] - массив записей. Если аргументы не переданы, все записи возвращаются.

Ответ 2

Однострочный подход:

var jsonData = Ext.encode(Ext.pluck(store.data.items, 'data'));

Не очень красиво, но довольно коротко.

Ответ 3

 function getJsonOfStore(store){
        var datar = new Array();
        var jsonDataEncode = "";
        var records = store.getRange();
        for (var i = 0; i < records.length; i++) {
            datar.push(records[i].data);
        }
        jsonDataEncode = Ext.util.JSON.encode(datar);

        return jsonDataEncode;
    }

Ответ 4

Попробуйте следующее:

myStore.each( function (model) {
    console.log( model.get('name') ); 
}); 

Ответ 5

Вам не нужно создавать какие-либо петли и собирать/перерабатывать данные. Объект json, который вам нужен, находится здесь:

var jsonData = store.proxy.reader.jsonData;

Ответ 6

Вот еще один простой способ:

var jsonArr = [];
grid.getStore().each( function (model) {
    jsonArr.push(model.data);
});

Ответ 7

Лучший (IMO) однострочный подход, работает на ExtJS 4, не уверен в 3:

store.proxy.reader.jsonData

Ответ 8

Простой способ сделать это:

var jsonArray = store.data.items

Итак, если ваш магазин JSON

[{"text": "ABC"}, {"text": "DEF"},{"text": "GHI"},{"text": "JKL"}]

Затем вы можете получить "DEF" как

jsonArray[1].data.text

В следующем коде я заметил, что он преобразует каждый символ в элемент массива.

var jsonData = Ext.encode(Ext.pluck(store.data.items, 'data'));

Ответ 9

Я всегда использую store.proxy.reader.jsonData или store.proxy.reader.rawData

Например, это возвращает элементы, вложенные в корень node, называемый 'data':

var some_store = Ext.data.StoreManager.lookup('some_store_id');
Ext.each(some_store.proxy.reader.rawData.data, function(obj, i){
   console.info(obj);
});

Это работает только после операции чтения хранилища (пока еще не обрабатывается).

Ответ 10

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

store.load();
store.on('load', function(store, records) {
    for (var i = 0; i < records.length; i++) {
    console.log(records[i].get('name'));
    };
});

Ответ 11

proxy: {
        type: 'ajax',
        actionMethods: {
            read: 'POST',
            update: 'POST'
        },
        api: {
            read: '/bcm/rest/gcl/fetch',
            update: '/bcm/rest/gcl/save'
        },
        paramsAsJson: true,
        reader: {
            rootProperty: 'data',
            type: 'json'
        },
        writer: {
            allowSingle: false,
            writeAllFields: true,
            type: 'json'
        }
    }

Использовать allowSingle, который он преобразует в массив

Ответ 12

Если вы хотите получить данные точно так же, как и вы, используя Writer (например, игнорируя поля с конфигурацией persist:false), используйте следующий код (Примечание: я тестировал его в Ext 5.1)

  var arr = [];   

    this.store.each(function (record) {
        arr.push(this.store.getProxy().getWriter().getRecordData(record))
    });  

Ответ 13

Как и было предложено выше, я попытался сделать снимок с ошибкой.

store.proxy.reader.jsonData

Но ниже один работал у меня

store.proxy.reader.rawData

Ответ 14

В моем случае мне нужен javascript jagged массив, например. [[ "row1Cell1", "row1cell2" ], [ "row2Cell1", "row2cell2" ]], основанный на содержимом хранилища сетки Ext.

javascript, как показано ниже, создаст такой массив, отбросив ключ id в объекте, который мне не нужен.

var tableDataArray = [];
Ext.ComponentQuery.query('[name="table1"]')[0].store.each(function(record){
    var thisRecordArray = [];
    for (var key in record.data) {
        if (key != 'id') {
            thisRecordArray.push(record.data[key]);
        }
    }
    tableDataArray.push(thisRecordArray);
});