2010-12-20 14 views
8

jqgrid rowObjectを使用した結果の最初のページでは、予想されるデータが返されますが、その後の結果ページでは不完全なデータが返されます。どうして?結果のjqGrid - rowObjectの矛盾?

最初のページ: rowObject [3]結果の「2」

後続のページに等しくなる: rowObjectを[3]「未定義」に等しくなり、今も結果の最初のページになります返します「未定義」と等しい

詳細といくつかのコード:jqGridで

、あなたは行データが含まれているrowObjectというパラメータを使用するカスタムフォーマッタを実装する場合。

["18", "133", "Betelguese", "3", "photo.jpg", "", "0", ""] 

だから私のカスタムフォーマッタは、次のようにリンクを準備するために、このデータの一部を使用しています:だから例えば、rowObjectの1行のようなものかもしれない

var newval = '<a href="/proj/' + rowObject[3] + '/images/' + imgval + '">' + imgval + '</a>'; 

、これは私のようなURLを提供します:

<a href="/proj/3/images/photo.jpg">photo.jpg</a> 

これまでのところとても良いです。すべてはしかし私ならば、正常に動作表示

<a href="/proj/undefined/images/photo.jpg">photo.jpg</a> 

を、私は結果の全てを含むページをロードする場合:私の問題は、私はjqgridに結果の次のページに行くとき、私は、このデータの一部を失うことにあるとgetページングを使用すると、結果の最初のページだけがrowObject [3]に対して正しい値を持ち、次のページの他のすべての結果はそのrowObject値を持ちません!

なぜグリッドに最初にロードされ、グリッド結果の次のページが表示されたときにそのデータを失うように見えるのか、正しいデータを含むrowObjectはありますか?私は...私は理解していないのFirebugで見ている

ことの一つは、最初にページの負荷が私が取得するとき:

console.log(rowObject); 
["18", "133", "Betelguese", "3", "photo.jpg", "", "0", ""] 

事は、私が期待どおりに動作を停止結果、の次のページで私は参照してください

console.log(rowObject); 
Object { photo_id="18", site_id="133", more...} 

なぜ変更?最初の結果はjsonなので、なぜ私は今このObjectを取得していますか?

答えて

10

loadonce:trueオプションを使用するとします。多くの問題(主に問題を理解する)をもたらす選択肢からのものです。ローカルとリモートのデータの分離は、新しいローカルソート、ページング、フィルタリング(検索)機能をjqGridの3.7に導入する前にはっきりしていました。 jqGridバージョン3.7以降では、loadonce:trueオプションを使用すると、最初に読み込んだリモートデータと後で読み込むローカルデータを混在させることができます。 another answerでは、近い問題がすでに議論されていました。ローディングプロセスの最後に、loadonce:trueオプション使用の場合、datatypeのjqGridは'local'に変更されます。その後、多くのものが異なって動作します。

私はあなたが整数インデックスrowObject[3](リモートデータにアクセスする場合)、または名前付きプロパティrowObject.projectIdあたりにつきrowObjectにアクセスする必要があるかどうかを決定するために迅速かつ効果的な方法としてjQuery.isArray(rowObject)を使用することをお勧めします。

ローカルデータ全体が$("#list").jqGrid('getGridParam','data')で表示され、すべてのローカル配列rowObjectが返されます。あなたがアクセスする必要のあるデータは(rowObject[3]は、いくつかの列にjqGridでに保存されていない場合は

あなたはrowObjectの情報を表示することはできません。この場合、追加の非表示列をデータに使用するか、最初のロード時にloadComplete: function(data) { ... }のデータをの外部オブジェクトに保存することができます。 $("#list").jqGrid('getGridParam','datatype')'json'(またはサーバーデータに応じて'xml')であることをテストして、それが真であれば、必要なサーバーから返されたすべてのデータを(data配列の3番目の列から)オブジェクト。したがって、後でカスタムフォーマッタの内部でデータにアクセスすることができます。

更新済み:問題は、free jqGrid fork of jqGridで解決されます。カスタムフォーマッタ(とcellattrrowattr)はまだ互換性の理由rowObjectパラメータが含まれますが、解析されたデータは、名前付きプロパティとして保存されている追加rowDataプロパティが存在している:一つは

cellattr: function (rowid, cellValue, rowObject, cm, item) { 
    // either rowObject[1] or rowObject.site_id, 
    // but item.site_id works ALWAYS 
} 
を使用することができます

formatter: function (cellValue, options, rowObject) { 
    // either rowObject[1] or rowObject.site_id, 
    // but options.rowData.site_id works ALWAYS 
} 

cellattr

+1

非常に役に立ちました...ありがとうございました! –

+2

@AshishJain:ようこそ!私は3歳以上の答えはまだ実際であり、助けることができるとうれしいです。 – Oleg

+1

@Oleg同じ問題があります。 loadonceを定義するかどうかは関係ありません:trueまたはそうではありません。私が第2ページに進むと、IDは未定義になります。 jqGrid( 'getGridParam'、 'data')私はもはやid(最初のページを含む)を持っていません。私の質問は、あなたが提案したのと同じように、私が外部オブジェクトを定義するときに機能します(そして、ソリューションに感謝します)が、それは「回避策」ではありませんか? –