2009-06-03 5 views
17

Je générer une réponse JSON de sorcière PHP ressemble à ceci:ExtJS attraper résultat JSON

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

Je veux saisir ces résultats en utilisant ExtJS. Voilà ce que j'ai jusqu'à présent:

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

Que dois-je écrire à côté pour obtenir les résultats JSON comme celui-ci:

var mymessages = jsonData.options; 

Et mymessages doivent contenir un message Exemple et ceci est le message 2ème exemple .

Merci.

Répondre

35

L'approche simple:

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

Ou vous pouvez le faire dans un plus Poste-ish chemin en utilisant magasin:

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 autre exemple pour aborder le dernier commentaire:

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

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

Bien que je préférerais le faire avec un Array.map (qui n'est pas fourni par Ext):

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

Cela fonctionne mais j'ai besoin d'accéder à tous les messages des options "catégorie". Je peux faire un jsonData.done et je reçois "1" comme réponse, mais comment puis-je récupérer tous les messages? –

+0

étendu mon exemple pour inclure l'affichage de tous les messages. –

+0

Merci, ça marche super! Sur plus de chose, si je peux: comment puis-je rassembler tous les messages et les montrer dans Ext.Msg.alert? –

6

Utilisez les propriétés succès et échec:

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

Voir les Ext API docs pour plus de détails

+0

Ce code manque une virgule après _params: {id: "1"} _ –

+0

En outre, cette dernière virgule, après la fonction d'échec, va provoquer une erreur dans Internet Explorer. Sinon, un modèle utile :) –

+0

Correction, merci – Kevin

1

si vous êtes sûr que votre entrée est correcte (méfiez-vous des attaques XSS Vous pouvez utiliser la fonction eval() pour rendre votre objet javascript à partir de votre résultat JSON, qui peut ensuite être accessible via votre commande:

var mymessages = jsonData.options; 

Mais là encore, poste fait que bien pour vous, comme René l'a souligné par la fonction Ext.decode

2

à cocher ce violon d'échantillon qui est pour Ext JS 4. http://jsfiddle.net/mrigess/e3StR/

Poste 4 on utilise Ext.JSON.encode() et Ext.JSON.decode(); tandis que Ext 3 utilise Ext.util.JSON.encode() et Ext.util.JSON.decode()