2011-07-12 13 views
1

さて、私は髪を引き裂く準備が整いました。 JSONデータをjqGridにロードしていますが、 "loadonce"をtrueに設定してローカルに保ちます。ソートのデフォルトの内容を表示するだけで、ソートが正常に機能しますが、必要なものは、別の列の情報を使用して表示される内容を変更する列があります。たとえば、「デバイス」と「モデル」の列を持つ代わりに、この「デバイスモデル」のように、両方の列を1つの列に表示する必要があります。カスタムフォーマッタを使用します。jqGridローカルデータ並べ替えで情報が失われる

この場合、ソートすると「モデル」情報が失われ、「未定義」になります。あなたが見ることができるように、私は表示されると仮定だところだから、デバイス欄にかけ、その情報を「移動」モデルの列を非表示にし、

mdlTable = tableWrap.jqGrid({ 
    url: loadURL, 
    datatype: 'json', 
    colNames: ['ID', 'Device', 'Description', 'IP', 'Model'], 
    colModel: [ 
     {name:'id', index:'id', hidden:true, key:true}, 
     {name:'device', index:'device', width:192, 
      formatter:function(value, options, rData){ 
       var str = "<a href='/administration/mdl/vwDevice.aspx?device_id="; 
       str += rData[0] + "' target='_blank'>" + value; 
       if ('' != rData[4]) str += " - " + rData[4]; 
       str += "</a>"; 
       return str; 
      } 
     }, 
     {name:'desc', index:'desc', width:256, sortable:false}, 
     {name:'ip', index:'ip', width:96}, 
     {name:'model', index:'model', hidden:true} 
    ], 
    sortname: 'id', 
    viewrecords: true, 
    loadonce: true, 
    viewsortcols: [true,'vertical',true], 
    gridview: true, 
    ignoreCase: true 
}) 
.navGrid('#deviceList_footer', {edit:false, add:false, del:false, cloneToTop:true}); 

:ここに私のコードの一部です。読み込み時には問題ありませんが、並べ替えや検索をしてビューを更新すると、何らかの理由でデータの「コピー」が失われます。私がモデル列を表示すると、そこに残っている情報はうまく残っています。それは単に定義されていない値を取得するデバイス列です。

私は "reloadGrid"をトリガしようとしましたが、助けにはなりません。私もunformat関数を追加しようとしましたが、私はそこで何ができるのか分かりません。私は基本的にちょうど$(cellobject).html()を返しました - それは明らかに機能しませんでした。

編集:追加のサンプルJSONデータ

{ "rows" : [{ 
     "id" : "181", 
     "cell" : ["181", "Router A", "some description", "55.444.33.222", "Model 1"] 
    }, { 
     "id" : "291", 
     "cell" : ["291", "Router B", "some description", "55.333.22.444", "Model 2"] 
    }, { 
     "id" : "1346", 
     "cell" : ["1346", "Router C", "some description", "55.111.44.333", "Model 3"] 
    }, { 
     "id" : "1999", 
     "cell" : ["1999", "Router D", "some description", "55.222.11.000", "Model 4"] 
    } 
]} 
+0

問題を再現するために使用できるテストJSONデータをいくつか含めることができますか? – Oleg

+0

テストJSONデータを追加 – ilia

答えて

7

は、問題が最初にカスタムフォーマッタの三番目のパラメータが配列型と、後でこれ以上を有することです。だから、

formatter: function(value, options, rData){ 
    var model = '', 
     str = "<a href='/administration/mdl/vwDevice.aspx?device_id=" + 
       value + "' target='_blank'>" + value; 
    if ($.isArray(rData)) { 
     model = rData[4]; 
    } else { 
     model = rData.model; 
    } 
    if (model) { 
     str += " - " + model; 
    } 
    str += "</a>"; 
    return str; 
} 

のようなものにフォーマッターを変更する必要が続いてソートが動作します:hereを参照してください。

もう1つのヒント。 id列のkey:trueプロパティを使用します。この場合、同じidの値を2回含める必要はありません。あなたは、新しいJSON形式を読み取ることができるように、以下の

{ "rows" : [ 
    ["181", "Router A", "some description", "55.444.33.222", "Model 1"], 
    ["291", "Router B", "some description", "55.333.22.444", "Model 2"], 
    ["1346", "Router C", "some description", "55.111.44.333", "Model 3"], 
    ["1999", "Router D", "some description", "55.222.11.000", "Model 4"] 
]} 

jqGridの変化のみにJSONデータを減らすことができ、追加のパラメータjsonReader: {cell:''}です。結果はhereです。

+0

ありがとうございました!それはまさに私が必要としていたものです。初期ロード後にrDataがタイプを変更していたことを認識していませんでした。他のチップにも感謝します。 – ilia

+0

@ilia:ようこそ! – Oleg

関連する問題