2011-09-16 11 views
0

グリッドデータを読み込む関数を呼び出すと、loadCompleteは起動しません。このイベントを処理する必要があるので、手動で複数選択チェックボックスを正しく更新することができます。 gridCompleteで更新する場合は、チェックボックスを2回クリックしてチェックを外す必要があります。JQGrid:loadCompleteは、データ型が関数の場合には起動しません。

+0

99%のケースでは、関数としての 'datatype'の使用は必要ありません。あなたは使用しているソースコードを含めることができますか? – Oleg

答えて

5

以前の質問では、サーバー側でWCFを使用すると書いていました。 の場合、としてdatatypeを使用する必要はありません。 JSON.stringifyはあなたがhereから読み込むことができますjson2.jsを含める必要があり、古いWebブラウザでサポートされていることを確認するために

datatype: "json", 
ajaxGridOptions: { contentType: "application/json" }, 
serializeGridData: function (data) { 
    return JSON.stringify(data); 
} 

:その代わりに、あなただけの次のパラメータを使用することができます。

the old answerには、jqGridでWCFを使用する方法を示すコードサンプル(およびデモをダウンロード)があります。

ここで、datatypeを機能として使用すると、元の質問に「なぜloadCompleteが発生しないのですか」と答えるようになります。短い答えは:datatypeを機能として使用する場合コードloadCompleteの呼び出しに責任があります。

datatypeを関数として使用している場合は、コードがjqGridが通常行ういくつかのことに責任があります。だから最初のすべてあなたはdatatype関数は何を理解する必要がありますを行う必要があります。ドキュメントの例(hereを参照)は、機能としてdatatypeの最も単純な、しかし完全ではない実装を示しています。より完全なコード例は、次のようになります。

$("#list").jqGrid({ 
    url: "example.php", 
    mtype: "GET", 
    datatype: function (postdata, loadDivSelector) { 
     var ts = this, // cache 'this' to use later in the complete callback 
      p = this.p; // cache the grid parameters 
     $.ajax({ 
      url: p.url, 
      type: p.mtype, 
      dataType: "json", 
      contentType: "application/json", 
      data: JSON.stringify(postdata), 
      cache: p.mtype.toUpperCase() !== "GET", 
      beforeSend: function (jqXHR) { 
       // show the loading div 
       $($.jgrid.jqID(loadDivSelector)).show(); 
       // if loadBeforeSend defined in the jqGrid call it 
       if ($.isFunction(p.loadBeforeSend)) { 
        p.loadBeforeSend.call(ts, jqXHR); 
       } 
      }, 
      complete: function() { 
       // hide the loading div 
       $($.jgrid.jqID(loadDivSelector)).hide(); 
      }, 
      success: function (data, textStatus, jqXHR) { 
       ts.addJSONData(data); 
       // call loadComplete 
       if ($.isFunction(p.loadComplete)) { 
        p.loadComplete.call(ts, data); 
       } 
       // change datatype to "local" to support 
       // "loadonce: true" or "treeGrid: true" parameters 
       if (p.loadonce || p.treeGrid) { 
        p.datatype = "local"; 
       } 
      }, 
      error: function (jqXHR, textStatus, errorThrown) { 
       if ($.isFunction(p.loadError)) { 
        p.loadError.call(ts, jqXHR, textStatus, errorThrown); 
      } 
     }); 
    }, 
    ... // other parameters 
}); 

コードはそれほど短くないことがわかります。上記の例では、仮想スクロール(scroll: 1またはscroll: true)のようないくつかのjqGridオプションはサポートしていません。

それでも私は今すぐクリアしましたなぜdatatypeを機能として使用することはお勧めしません。あなたがそれを使用する場合、多くのことを理解しなければならないjqGridが内部的にどのように働くか。すべてのことを正しく行うために、ソースコードを調べる必要があります。何かをスキップすると、いくつかの状況やjqGridパラメータの組み合わせによってコードが正しく動作しません。

回答の冒頭に含まれているコード(ajaxGridOptionsserializeGridDataの使用)を見ると、コードが非常に簡単であることがわかります。さらに、は、jqGridパラメータの他のすべての正当な組み合わせで動作します。たとえば、loadonce: trueloadCompleteloadError、または仮想スクロール(scroll: 1またはscroll: true)を使用できます。必要なものは、すべてdojqGrid doに依存します。

関連する問題