2010-03-26 22 views
37

¿Existe un método que permite que yo regresara mis datos almacenados en un panel de cuadrícula ExtJS exactamente de la manera que lo cargó usando:Cómo recuperar JSON matriz de datos de ExtJS tienda

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

me gustaría tener un usuario opción para volver a cargar la Grilla, pero los cambios en la tienda deben tenerse en cuenta. El usuario puede realizar cambios y la cuadrícula se actualiza dinámicamente, pero si recargo la cuadrícula, los datos que se cargaron originalmente se muestran aunque la base de datos se haya actualizado con los nuevos cambios. Preferiría no volver a cargar la página y dejar que vuelvan a cargar los datos de la cuadrícula con la tienda que acaba de cambiar.

supongo que estoy buscando algo como esto:

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

después de su todo dicho y hecho. O hay una forma diferente de actualizar la grilla con datos nuevos de los que no tengo conocimiento. Incluso el uso del proxy aún utiliza los datos "originales", no la nueva tienda.

+0

todas estas soluciones tienen un problema básico en EXTjs5 http://www.sencha.com/forum/showthread.php?290444-store.getData%28%29-returns-quot-id-quot- elment-in-model-data-bug & p = 1061271 todavía no sé si es error o función – mcmatak

Respuesta

51

Store.getRange() parece ser exactamente lo que está buscando. Te devolverá Ext.data.Record[] - matriz de registros. Si no se pasan argumentos, se devuelven todos los registros.

+7

Estaba buscando Store.getRange(). json – sctskw

+4

@ user291928: Honestamente, no especificó el formato en el que necesitaba los datos y esta respuesta parece haber ayudado. Te sugiero que selecciones una respuesta. – Keylan

+1

Nombre del método Crappy. ¡Gracias por mencionarlo! – phatmann

9
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; 
    } 
46

Un enfoque de una sola línea:

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

No es muy bonito, pero bastante corto.

+0

esto es para Ext 4.0> – jellyfishtree

+0

funciona también para 3.3.1 - está en la documentación - Yo desde que encontré esta publicación la uso con éxito total y la considero bonita – bensiu

+0

Este método ha sido IMPRESO desde 4.0.0 –

4

Prueba esto:

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

A (OMI) el enfoque de una línea mejor, trabaja en ExtJS 4, no está seguro de aproximadamente 3:

store.proxy.reader.jsonData 
+0

Bueno, porque el docs dicen que lo anterior está en desuso, aunque RawData en su lugar (listado inmediatamente debajo de jsonData) podría funcionar, pero no lo he probado http://docs.sencha.com/ext-js/4-0/#!/api/Ext .data.reader.Json-property-jsonData –

0

me encuentro con mi parte de problemas tratando de acceder a los datos de la tienda sin vincularlo a un componente, y la mayor parte se debió a que la tienda se cargó a través de ajax, por lo que se tardó en utilizar el evento de carga para leer los datos. Esto funcionó:

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

Una forma sencilla de hacerlo es

var jsonArray = store.data.items 

Así que si su tienda JSON es

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

A continuación, puede retreive "DEF" como

jsonArray[1].data.text 

En el siguiente código, noté que convierte todos y cada uno de los personajes en un elemento de matriz.

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

siempre uso store.proxy.reader.jsonData o store.proxy.reader.rawData

Por ejemplo - esto devuelve los elementos anidados en un nodo raíz denominado 'datos':

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

esto sólo funciona inmediatamente después de una lectura tienda operación (aunque no se ha manipulado aún).

+0

¡Un poco de código de muestra, o un enlace a un ejemplo, sería incluso mejor! –

2

Aquí es otra forma limpia simple:

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

No es necesario hacer ningún bucles y recoger/reprocesar los datos. El objeto JSON que necesita está aquí:

var jsonData = store.proxy.reader.jsonData; 
+1

esto obtendrá los datos originales de la tienda, no los datos actualizados de la tienda que podrían haberse modificado desde – xblitz

0
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' 
     } 
    } 

Uso allowSingle se convertirá en una matriz

0

Si desea obtener los datos exactamente como lo que se obtiene por Writer (por ejemplo, haciendo caso omiso de los campos con persist:false config), utilice el siguiente código (Nota: he comprobado en Ext 5,1)

var arr = []; 

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

Como se sugirió anteriormente he intentado por debajo de uno de fallar.

store.proxy.reader.jsonData 

Pero a continuación se trabajó para mí

store.proxy.reader.rawData 
0

En mi caso quería una matriz escalonada Javascript, por ejemplo, [["row1Cell1", "row1cell2"], ["row2Cell1", "row2cell2"]] según el contenido del almacén de cuadrícula Ext.

El javascript como a continuación creará dicha matriz, dejando caer la clave de identificación en el objeto que no necesitaba.

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); 
}); 
Cuestiones relacionadas