jqGrid - 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 のラッパー。
とにかく、jqGrid の jsonReader プロパティを、JSON 結果の解析を開始する正しい場所にポイントすることはできますか?私はこれらすべてにとても時間を費やしています:)
- - 編集 - -
簡単な例を投稿したいと思いました...スタンツさん、ご回答ありがとうございます。次の例に必要なのは .NET だけです。 ジェイロック, jQuery, 、 そして jqグリッド. 。これは上記の 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
}
});
});
解決
いいえ、jsonReader を介してこれを行うことはできません。グリッドは内部的に次のことを行います。
ts.p.page = data[ts.p.jsonReader.page];
...これは点線のサブプロパティでは機能しません。
代わりに、データ型を関数に設定して、グリッド データを手動でフェッチする必要があります。その後、$.ajax を使用してデータをフェッチし、グリッドと同様にデータが戻ってきたときに Grid.addJsonData を呼び出すことができます。ただし、応答全体を渡す代わりに、応答のサブプロパティを渡す点が異なります。
他のヒント
この投稿とリンクは本当に役に立ちました。これがどのように機能するかはまだ明確に理解していませんが、誰かの痛みを和らげるためにこれを投稿したいと思いました:)
これは getRecords から返される JSON です。
{"id":-1、 "result":{"page": "1"、 "total": "1"、 "records": "2"、 "rows":[{"id": "13" 、「Invdate」:「2007-10-06 "、" name ":" client 3 "、" bult ":" 1000.00 "、"税 ":" 0.00 "、" Total ":" 1000.00 "、" note ": "}、{" id ":" 12 "、" Invdate ":" 2007-10-06 "、" name ":" client 2 "、" lument ":" 700.00 "、" tax ":" 140.00 "、 "Total": "840.00"、 "note": "No Tax"}]}}
そして、これが実際に動作するコードです:
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 リンクから取得しました。
つまり、"{id:'-1','result':{ /* ... を追加します。をちょきちょきと切る ...*/ }}" 作業用 JSON のラッパー。
これは、JayRock が SMD 応答を処理する方法の副作用です。「ID」は「応答識別子」であり、非同期通信を支援します。
したがって、多数の非同期リクエストを発行する場合 (応答を待たない場合)、「リクエスト ID」を指定すると、JayRock がそれを尊重するため、応答をリクエストと並べることができます。
それが少しは意味があるといいのですが。