Как настроить jsonreader (для использования с Jayrock)? - PullRequest
4 голосов
/ 29 июня 2009

Я задавался вопросом, может ли кто-то иметь некоторое представление об этом. jqGrid вполне доволен этой строкой 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 JSON-RPC framework) предоставляет строку JSON в виде:

{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'}]}}

т.е. он добавляет оболочку "{id:'-1','result':{ /* ... snip ... */ }}" вокруг работающего JSON.

Есть ли способ указать свойству jsonReader в jqGrid правильное место для начала анализа результата JSON? У меня чертовски много времени со всем этим :)

--- редактировать ---

Я хотел бы опубликовать краткий пример ... спасибо за ваш ответ, Stuntz. Все, что нужно для следующего примера, - это .NET, Jayrock , jQuery и jqGrid . Это работает с вышеупомянутым JSON. Я забыл, нужно ли вам устанавливать тип контента.

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

Ответы [ 3 ]

2 голосов
/ 29 июня 2009

Нет, вы не можете сделать это через jsonReader. Внутренне сетка делает:

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

... который не будет работать для пунктирной подсвойства.

Вместо этого вам нужно будет извлекать данные сетки вручную, устанавливая тип данных для функции. Затем вы можете извлечь данные с помощью $ .ajax и вызвать grid.addJsonData, когда он вернется, точно так же, как это делает сетка, за исключением того, что вместо передачи всего ответа вы передадите подсвойство ответа.

1 голос
/ 10 февраля 2012

т.е. он добавляет оболочку "{id: '- 1', 'result': {/ * ... snip ... * /}}" вокруг работающего JSON.

Это побочный эффект от того, как JayRock обрабатывает SMD-ответы ... "id" - это "идентификатор ответа" и помощь для асинхронной связи.

Итак, если вы запускаете несколько асинхронных запросов (и не ждете ответа), вы можете указать «идентификатор запроса», и JayRock выполнит это ... так что вы можете выровнять ответы с запросы.

Надеюсь, это имеет смысл.

1 голос
/ 02 июля 2010

Этот пост и ссылки были действительно полезны. У меня пока нет четкого понимания того, как это работает, но я подумал, что просто опубликую это, чтобы помочь кому-то облегчить свою боль:)

Это возвращаемый JSON из getRecords:

{ "идентификатор": - 1, "результат": { "страница": "1", "всего": "1", "запись": "2", "строка": [{ "ID": "13", "invdate": "2007-10-06", "имя": "Клиент 3" , "количество": "1000,00", "налог": "0,00", "общее": "1000,00", "примечание": ""}, { "ID": "12", "invdate": "2007 -10-06" , "имя": "Клиент 2" , "количество": "700,00", "налог": "140,00", "общее": "840,00", "примечание": "нет налог "}]}}

И это рабочий код:

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

Кстати, кто-нибудь знает, почему использование eval небезопасно? Посмотрите на комментарий к моему коду. Я взял эту часть из ссылки forum.asp.

...