Ответ 1
Store.getRange()
, похоже, именно то, что вы ищете. Он вернет вам Ext.data.Record[]
- массив записей. Если аргументы не переданы, все записи возвращаются.
Есть ли способ, позволяющий мне вернуть мои сохраненные данные в Grid Panel ExtJS точно так, как я его загрузил, используя:
var data = ["value1", "value2"]
Store.loadData(data);
Я хотел бы иметь пользовательский параметр для перезагрузки Grid, но изменения в хранилище должны быть приняты во внимание. Пользователь может вносить изменения, а сетка динамически обновляется, но если я перезагружу сетку, данные, которые были первоначально загружены, отображаются, даже если база данных обновлена с новыми изменениями. Я бы предпочел не перезагружать страницу и просто позволить им перезагружать данные сетки с помощью вновь измененного хранилища.
Думаю, я ищу что-то вроде этого:
var data = Store.getData();
//data = ["value1", "value2"]
после того, как все сказано и сделано. Или есть другой способ обновить сетку новыми данными, о которых я не знаю. Даже использование прокси-сервера по-прежнему использует "оригинальные" данные, а не новый магазин.
Store.getRange()
, похоже, именно то, что вы ищете. Он вернет вам Ext.data.Record[]
- массив записей. Если аргументы не переданы, все записи возвращаются.
Однострочный подход:
var jsonData = Ext.encode(Ext.pluck(store.data.items, 'data'));
Не очень красиво, но довольно коротко.
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;
}
Попробуйте следующее:
myStore.each( function (model) {
console.log( model.get('name') );
});
Вам не нужно создавать какие-либо петли и собирать/перерабатывать данные. Объект json, который вам нужен, находится здесь:
var jsonData = store.proxy.reader.jsonData;
Вот еще один простой способ:
var jsonArr = [];
grid.getStore().each( function (model) {
jsonArr.push(model.data);
});
Лучший (IMO) однострочный подход, работает на ExtJS 4, не уверен в 3:
store.proxy.reader.jsonData
Простой способ сделать это:
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'));
Я всегда использую 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);
});
Это работает только после операции чтения хранилища (пока еще не обрабатывается).
Я столкнулся с проблемой, связанной с доступом к данным из хранилища, не привязывая ее к компоненту, и большая часть из них заключалась в том, что хранилище было загружено через ajax, поэтому для чтения данных потребовалось использовать событие загрузки. Это сработало:
store.load();
store.on('load', function(store, records) {
for (var i = 0; i < records.length; i++) {
console.log(records[i].get('name'));
};
});
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, который он преобразует в массив
Если вы хотите получить данные точно так же, как и вы, используя Writer
(например, игнорируя поля с конфигурацией persist:false
), используйте следующий код (Примечание: я тестировал его в Ext 5.1)
var arr = [];
this.store.each(function (record) {
arr.push(this.store.getProxy().getWriter().getRecordData(record))
});
Как и было предложено выше, я попытался сделать снимок с ошибкой.
store.proxy.reader.jsonData
Но ниже один работал у меня
store.proxy.reader.rawData
В моем случае мне нужен 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);
});