Как настроить jsonreader (для использования с Jayrock)?
Я задавался вопросом, может ли кто-то иметь некоторое представление об этом. 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) предоставляет строку 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 ответа
Нет, вы не можете сделать это через jsonReader. Внутренне сетка делает:
ts.p.page = data[ts.p.jsonReader.page];
... который не будет работать для пунктирной подсвойства.
Вместо этого вам нужно будет извлечь данные сетки вручную, установив тип данных для функции. Затем вы можете извлечь данные с помощью $.ajax и вызвать grid.addJsonData, когда он вернется, точно так же, как это делает сетка, за исключением того, что вместо передачи всего ответа вы передадите подчиненное свойство ответа.
Т.е. он добавляет обертку "{id:'-1','result':{ /* ... snip ... */ }}" вокруг работающего JSON.
Это побочный эффект от того, как JayRock обрабатывает SMD-ответы... "id" - это "идентификатор ответа" и помощь для асинхронной связи.
Итак, если вы запускаете кучу асинхронных запросов (и не ждете ответа), вы можете указать "идентификатор запроса", и JayRock выполнит это... так что вы можете выровнять ответы с запросами.
Я надеюсь, что это имеет смысл.
Этот пост и ссылки были действительно полезны. У меня пока нет четкого понимания того, как это работает, но я подумал, что просто опубликую это, чтобы помочь кому-то облегчить их боль:)
Это возвращаемый 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","name":"Client 2","amount":"700.00","tax":"140.00","total":"840.00","note":"нет налога"}]}}
И это рабочий код:
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.