Question

Je me demandais si quelqu'un pourrait avoir un aperçu de ce sujet. jqGrid est tout à fait satisfait de cette chaîne JSON:

{'page':'1','total':1,'records':'4','rows':[{'id':1,'title':'Story Manager','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':2,'title':'Analysis','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':3,'title':'Narrative','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':4,'title':'Graphic','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'}]}

Jayrock (.NET cadre JSON-RPC) fournit la chaîne JSON comme:

{id:'-1','result':{'page':'1','total':1,'records':'4','rows':[{'id':1,'title':'Story Manager','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':2,'title':'Analysis','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':3,'title':'Narrative','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':4,'title':'Graphic','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'}]}}

i.e.. il ajoute une enveloppe « {id:'-1','result':{ /* ... snip ... */ }} » autour du JSON de travail.

Y at-il de toute façon à pointer la propriété jsonReader de jqGrid au bon endroit pour commencer l'analyse du résultat JSON? Je vais avoir un mal fou avec tout cela:)

--- --- modifier

Je voulais poster un exemple rapide ... merci pour votre réponse, Stuntz. Tout ce qui est nécessaire pour l'exemple suivant est .NET, Jayrock , jQuery et jqGrid . Cela fonctionne avec le JSON ci-dessus. Je ne sais plus si oui ou non vous devez définir le type de contenu.

var lastsel; // last row selected (for editing)      

jQuery(document).ready(function(){ 
    jQuery("#mygrid").jqGrid({ 
        contentType: "text/plain; charset=utf-8",
        datatype: function(postdata)
        {
            $.ajax({
                url: 'http://localhost:2064/StoryManager/StoryManager.ashx/getPageItemRoles?id=3',
                data: postdata,
                complete: function(response, status)
                {
                    if(status=='success')
                    {
                        var mygrid = jQuery("#mygrid")[0];
                        var o = eval("(" + response.responseText + ")"); // TODO don't use eval.  it's insecure, but older browsers support it...
                        mygrid.addJSONData(o.result);
                    }
                }
            })
        },                
        colNames:['ID', 'Title', 'Assigned To', 'Assigned', 'Due', 'Completed'],
        colModel:[
            {name:'id', label:'ID', jsonmap:'id', hidden: true,  editrules: { edithidden: true }},
            {name:'title', jsonmap:'title', editable: true},
            {name:'assignedto', label:'Assigned To', jsonmap:'assignedto', editable: true},
            {name:'assigned', jsonmap:'assigned', editable: true},
            {name:'due', jsonmap:'due', editable: true},
            {name:'completed', jsonmap:'completed', editable: true}
        ],
        jsonReader: {
            repeatitems: false
        }
    });  
});
Était-ce utile?

La solution

Non, vous ne pouvez le faire via jsonReader. En interne, la grille fait:

        ts.p.page = data[ts.p.jsonReader.page];

... qui ne fonctionne pas pour une sous-propriété en pointillé.

vous avez besoin au lieu de récupérer les données de la grille manuellement en définissant le type de données à une fonction. Vous pouvez ensuite récupérer les données avec .ajax $, et appelez grid.addJsonData quand il revient, tout comme la grille ne, sauf qu'au lieu de passer toute la réponse, vous passerez un sous-propriété de la réponse.

Autres conseils

Ce message et des liens ont été très utiles. Je n'ai pas une compréhension claire sur la façon dont cela fonctionne encore, mais je pensais que je voudrais juste poster ceci pour aider quelqu'un à soulager leur douleur:)

Ceci est le JSON retour de getRecords:

  

{ "id": - 1, "résultat": { "page": "1", "total": "1", "records": "2", "lignes": [{ "id": "13", "invdate": "2007-10-06", "name": "client   3" , "quantité": "1000.00", "taxe": "0.00", "total": "1000.00", "note": ""}, { "id": "12", "invdate": "2007 -10 à 06" , "name": "client   2" , "quantité": "700,00", "taxe": "140.00", "total": "840.00", "note": "pas   taxe "}]}}

Et voici le code de travail:

jQuery(document).ready(function(){ 
    jQuery("#list4").jqGrid({ 
        contentType: "text/plain; charset=utf-8",
        datatype: function(postdata)
        {
            $.ajax({
                url: 'http://localhost/Booga/Baba.ashx/getRecords',
                data: "{}", // For empty input data use "{}",
                dataType: "json",
                type: "GET",
                contentType: "application/json; charset=utf-8",
                complete: function(response, status)
                {
                    if(status=='success')
                    {
                        var mygrid = jQuery("#list4")[0];
                        var o = eval("(" + response.responseText + ")");// TODO don't use eval.  it's insecure, but older browsers support it...
                        mygrid.addJSONData(o.result);
                    }
                }
            })
        },                
    colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],
    colModel:[
        {name:'id',index:'id', width:55},
        {name:'invdate',index:'invdate', width:90, jsonmap:"invdate"},
        {name:'name',index:'name asc, invdate', width:100},
        {name:'amount',index:'amount', width:80, align:"right"},
        {name:'tax',index:'tax', width:80, align:"right"},      
        {name:'total',index:'total', width:80,align:"right"},       
        {name:'note',index:'note', width:150, sortable:false}       
    ],
        jsonReader: {
            repeatitems: false
        }
    });  
});

Par ailleurs, personne ne sait pourquoi l'utilisation eval est précaire? Regardez le commentaire sur mon code. Je saisis cette partie du lien forum.asp.

  

i.e.. il ajoute un "{id: '- 1', 'résultat': {/ * ... snip ... * /}}" wrapper autour du travail JSON

.

Ceci est un effet secondaire de la manière JayRock gère les réponses SMD ... le « id » est un « identificateur de réponse » et est une aide pour les communications asynchrones.

Donc, si vous tirez hors d'un tas de demandes async (et ne pas attendre pour trouver la réponse), vous pouvez spécifier la « demande ID » et JayRock honorerez que ... de sorte que vous pouvez aligner les réponses avec les demandes.

J'espère que cela fait un peu de sens.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top