4

jqGridをソートするのに問題がありました。クライアントでこの並べ替えを実行することをお勧めしますが、並べ替えられた結果を取得するためにデータベースを新たに呼び出すこともできます。

列ヘッダーをクリックすると、並べ替え矢印によって方向が変わりますが、データはまったく変わりません。

私はこの質問を調べましたが、reloadGridを呼び出すことは役に立たなかったようです。

私のグリッド全体は次のとおりです。

var x = $("#grid").jqGrid({
    jsonReader: { root: "rows", repeatitems: false },
    datatype: "json",
    height: 'auto',
    autowidth: true,
    forceFit: true,
    colNames:['ID','Name'],
    colModel:[
        {name:'id', key:true, index:'id', width:60, sorttype:"int", jsonmap:"id"},
        {name:'name', index:'name', width:90,  jsonmap: "name"}
    ],
    caption: "Results",
    loadonce: true,
    sortable: true,
    loadComplete: function() {
        jQuery("#grid").trigger("reloadGrid"); // Call to fix client-side sorting
    }
});

//This data comes from a web service call, hard coding in to test
var jsonData = [
    {id: 1, name: 'Apple'},
    {id: 2, name: 'Banana'},
    {id: 3, name: 'Pear'},
    {id: 4, name: 'Orange'}
];

x[0].addJSONData( { rows: jsonData } );
4

3 に答える 3

9

サーバーからソートされていないデータをロードし、一度だけローカル データをソートしたい場合は、jQuery("#grid").trigger("reloadGrid");内に配置しないでくださいloadComplete。コールバックは、ローカル データのすべての並べ替えまたはページングでloadCompleteも呼び出されます。また、の内部で呼び出した方がよいでしょう。この場合、グリッドの完全な最初の読み込みは、再読み込みの前に終了します。jQuery("#grid").trigger("reloadGrid");setTimeout

私はテストしていませんが、正しいコードはloadComplete次のようになると思います

loadComplete: function () {
    var $this = $(this);
    if ($this.jqGrid('getGridParam', 'datatype') === 'json') {
        if ($this.jqGrid('getGridParam', 'sortname') !== '') {
            // we need reload grid only if we use sortname parameter,
            // but the server return unsorted data
            setTimeout(function () {
                $this.triggerHandler('reloadGrid');
            }, 50);
        }
    }
}

この場合、reloadGridはサーバーからのグリッドの最初のロード時に 1 回だけ呼び出されます。次の呼び出しでは、datatypeオプションの値はすでに になってい'local'ます。

更新: 無料の jqGridは、2014 年末から開発を開始した jqGrid のフォークです。多くの新機能があります。このオプションを使用して、現在のデータ ページが jqGrid に表示されるforceClientSorting: trueに、クライアント側でデータの並べ替えとフィルタリングを強制することができます。したがって、古い回答で説明されているように、オプションを追加してトリックを削除するだけです。forceClientSorting: true

于 2012-04-23T19:56:27.133 に答える
1

なぜこれが機能するのか完全にはわかりませんが、1つの解決策を見つけました。おそらく誰かがより良い答えを提供することができます。

var x = $("#grid").jqGrid({
    jsonReader: { root: "rows", repeatitems: false },
    datatype: "json",
    height: 'auto',
    autowidth: true,
    forceFit: true,
    colNames:['ID','Name'],
    colModel:[
        {name:'id', key:true, index:'id', width:60, sorttype:"int", jsonmap:"id"},
        {name:'name', index:'name', width:90,  jsonmap: "name"}
    ],
    caption: "Results",

    //Required for client side sorting
    loadonce: true,
    gridComplete: function(){ 
      $("#grid").setGridParam({datatype: 'local'}); 
    }
于 2012-04-23T19:20:20.640 に答える
0

loadonce事前定義されたローダーでのみ機能します。データ型を関数として使用する場合はdatatype:local、カスタム関数を使用してグリッドを最初にロードした後に手動で設定する必要があります。

次のようなことを試してください:

datatype : function (){
    $.ajax({
    …
    complete :function (…){
                …
                $("#mygrid").setGridParam({datatype:'local'});
        }
    })
},
于 2013-05-20T17:49:10.347 に答える