2009-06-03 14 views
17

estoy generando respuesta JSON desde PHP bruja se ve así:ExtJS agarrar JSON resultado

{ done:'1', options: [{ message:'Example message'},{message:'This is the 2nd example message'}]} 

Quiero agarrar estos resultados usando ExtJS. Esto es lo que tengo hasta ahora:

Ext.Ajax.request({ 
    loadMask: true, 
    url: 'myfile.php', 
    params: {id: "1"} 
}); 

Lo que tengo que escribir a continuación para obtener los resultados JSON como este:

var mymessages = jsonData.options; 

Y mymessages deben contener mensaje Ejemplo y este es el segundo ejemplo de mensaje .

Gracias.

Respuesta

35

El enfoque directo:

Ext.Ajax.request({ 
    loadMask: true, 
    url: 'myfile.php', 
    params: {id: "1"}, 
    success: function(resp) { 
    // resp is the XmlHttpRequest object 
    var options = Ext.decode(resp.responseText).options; 

    Ext.each(options, function(op) { 
     alert(op.message); 
    } 
    } 
}); 

O bien, podría hacerlo de una manera más Ext-ish usando la tienda:

var messages = new Ext.data.JsonStore({ 
    url: 'myfile.php', 
    root: 'options', 
    fields: [ 
    {name: 'text', mapping: 'message'} 
    ], 
    listeners: { 
    load: messagesLoaded 
    } 
}); 
messages.load({params: {id: "1"}}); 

// and when loaded, you can take advantage of 
// all the possibilities provided by Store 
function messagesLoaded(messages) { 
    messages.each(function(msg){ 
    alert(msg.get("text")); 
    }); 
} 

Un ejemplo más para abordar el último comentario:

var messages = [{title: "1"},{title: "2"},{title: "3"}]; 

var titles = msg; 
Ext.each(messages, function(msg){ 
    titles.push(msg.title); 
}); 
alert(titles.join(", ")); 

Aunque preferiría hacerlo con un Array.map (que no es proporcionado por Ext):

var text = messages.map(function(msg){ 
    return msg.title; 
}).join(", "); 
alert(text); 
+0

Funciona, pero necesito acceder a todos los mensajes de las opciones "categoría". Puedo hacer un jsonData.done y obtengo el "1" como respuesta, pero ¿cómo podría obtener todos los textos de "mensaje"? –

+0

expandí mi ejemplo para incluir mostrando todos los mensajes. –

+0

¡Gracias, funciona genial! En más cosas, si puedo: ¿cómo puedo reunir todos los mensajes y mostrarlos en Ext.Msg.alert? –

6

Utilice la éxito y fracaso propiedades:

Ext.Ajax.request({ 
    loadMask: true, 
    url: 'myfile.php', 
    params: {id: "1"}, 
    success: function(response, callOptions) { 
     // Use the response 
    }, 
    failure: function(response, callOptions) { 
     // Use the response 
    } 
}); 

Ver las Ext API docs para más detalles

+0

A este código le falta una coma después de _params: {id: "1"} _ –

+0

Además, esa última coma, después de la función de falla, causará un error en Internet Explorer. De lo contrario, una plantilla útil :) –

+0

Reparado, gracias – Kevin

1

si está seguro de que su entrada es correcta (cuidado con los ataques XSS) puede usar la función eval() para hacer que su objeto javascript provenga de su resultado json, que luego se puede acceder a través de su comando:

var mymessages = jsonData.options; 

Pero, de nuevo, Ext hace eso muy bien para usted, como René ha señalado a través de la función Ext.decode

2

cheque esta muestra violín que es para Ext JS 4. http://jsfiddle.net/mrigess/e3StR/

Ext 4 en adelante utiliza Ext.JSON.encode() y Ext.JSON.decode(); mientras que Ext 3 usa Ext.util.JSON.encode() y Ext.util.JSON.decode()