2011-07-29 6 views
1

これはおそらく最高のタイトルではないかもしれませんが、それは私が行っていると思います。私のデータのjQuery処理について混乱しています

私はthis questionに、ユーザーがフィルタリングのために利用可能な選択肢から選択できるように、jqGridにドロップダウンリストを設定したいと書きました。提供されるソリューションは、あるインスタンスでは動作しますが、別のインスタンスでは動作しません。それは私のスタックトレースがそうのように見える(列ヘッダーのドロップダウンフィルタのための)データを取得する第一のタイプ:

callback() jquery-1.6.2.js (line 7947) 
_ = readystatechange 

done() jquery-1.6.2.js (line 7183) 
status = 200 
statusText = "success" 
responses = Object { text="["Cake", "Sugar", "Waffle"]" } 
headers = "Server: ASP.NET Develop...: 22\nConnection: Close\n" 

resolveWith() jquery-1.6.2.js (line 1008) 
context = Object { url="/IceCream/AvailableConeTypes", isLocal=false, more...} 
args = [ Object { readyState=4, responseTExt="["Cake", "Sugar", "Waffle"]", more...} "success"] 

complete() jquery...src.js(line 3591) 
res = Object { readyState=4, responseText="["Cake", "Sugar", "Waffle"]", more...} 
status = "success" 

myBuildSelect() Cone (line 75) 
data = Object { readyState=4, responseText="["Cake", "Sugar", "Waffle"]", more...} 

これが呼び出された二回目(あなたが複数構築することを可能にするjqGridツールバーのフィルタダイアログのAND/ORフィルタ)スタックトレースは若干異なります。

callback() jquery-1.6.2.js (line 7947) 
_ = readystatechange 

done() jquery-1.6.2.js (line 7168) 
status = 200 
statusText = "success" 
responses = Object { text="["Cake", "Sugar", "Waffle"]" } 
headers = "Server: ASP.NET Develop...: 22\nConnection: Close\n" 

resolveWith() jquery-1.6.2.js (line 1008) 
context = Object { elem=, options={...} } 
args = [ "["Cake", "Sugar", "Waffle"]", "success", Object { readyState=4, responseText="["Cake", "Sugar", "Waffle"]", more...} ] 

success() jquery...src.js(line 5099) 
data ="["Cake", "Sugar", "Waffle"]" 
status = "success" 

myBuildSelect() Cone (line 75) 
data = ="["Cake", "Sugar", "Waffle"]" 

ここで何が起こっているのか混乱しています。

deferred.resolveWith { callbackContext, [success, statusText, jqXHR]); (line 7168) 

と第二のインスタンスでは、ラインを実行します:

completeDeferred.resolveWith(callbackContext, [ jqXHR, statusText]); (line 7183) 
参照ラインのjqueryの - 1.6.2.jsファイルを見て、私はまず第一に、それはラインを実行していることがわかり

2回目にそのコントローラーの操作が呼び出されたときに、そのようなものがキャッシュされたり、別の方法で処理されているようです。もしそれが役に立つのであれば、私は追加のコードを投稿することができますが、これはOlegのソリューションと一緒に以前の質問で書いたものです。アイデア?

答えて

1

まず最初に、非常に古い4.0.0バージョン(質問に含まれたjquery.jqGrid.src.jsの行番号はv4.0.0からのものです)の代わりに、最後の4.1.2バージョンのjqGridを使用することをお勧めします。バージョン4.1.2には多くのバグ修正が含まれています。

問題が発生した理由は次のとおりです。 completeまたはsuccessおよびerrorイベントハンドラをjQuery.ajaxに使用して、サーバーの応答を処理できます。古いjqGridコードでは、どこでもcompleteイベントハンドラが使用されていました。それは最良の方法ではありませんでした。だから、多くの場所でしかしすべてではありません(!!!)jqGridコードが変更されました。ほとんどはsuccesserrorハンドラが使用されていません。 completeハンドラの内部でdataパラメータはstring(JSON形式)です。したがって、データをオブジェクトに変換するには、$.parseJSONという追加の呼び出しを行う必要があります。 successの内部では、既に処理されたdataは、サーバー応答の「Content-Type」HTTPヘッダーに対応し、$.ajaxdataTypeパラメーターに対応します。

一つはbuildSelectcompleteハンドラの内部でfilterToolbarに呼び出され、それがsuccessハンドラの内部でcreateElに呼び出されることを、jqGridのソースコードで見つけることができます。それはあなたが持っている問題です。

trirand forumのバグレポートとして問題の説明を投稿することをお勧めします。または、私はあなたのためにそれを行うことができます。私は次のように、私はあなたの前の質問にmy answerで提案buildSelect機能を変更することをお勧め回避策として

my.buildSelect = function(data) { 
    var response = typeof(data) === "string" ? 
         jQuery.parseJSON(data.responseText): 
         data, 
     s = '<select>', i, l, ri; 

    if (response && response.length) { 
     for (i=0, l=response.length; i<l; i += 1) { 
      ri = response[i]; 
      s += '<option value="' + ri + '">' + ri + '</option>'; 
     } 
    } 
    return s + '</select>'; 
}; 

だから私はdata入力パラメータの種類をテストすることをお勧めします。変更後、コードはすべての状況で動作するはずです.jqGridがハンドラcompleteハンドラの代わりにsuccessハンドラを使用するように変更されても動作します。

+0

あなたの励ましと洞察力オレグありがとう。私はあなたの助けを借りてこれを手に入れました私が書かなかったコードの雑草に降りてきて、それをすべてよく理解していないと、これらのものを(少なくとも私のために)デバッグするのは非常に難しいことがあります。 jqGridとjQueryに精通していることを誇りに思います。ありがとう! – itsmatt

+0

@itsmatt:ようこそ!そして、私に向けられた良い言葉に感謝します。 – Oleg

関連する問題