对jQuery处理我的数据感到困惑

时间:2011-07-29 12:42:00

标签: jquery asp.net-mvc jqgrid

很可能不是最好的头衔,但这就是我的想法。

我写了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...}

第二次调用它时(对于允许构造多个AND / OR过滤器的jqGrid工具栏过滤器对话框),堆栈跟踪略有不同:

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"]"

我很困惑这里发生了什么。查看引用行的jquery-1.6.2.js文件,我看到它在第一个实例中执行该行:

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

并在第二个实例中执行以下行:

completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText] );  (line 7183)

当第二次调用该控制器操作时,似乎正在缓存或处理不同的事情。我可以发布额外的代码,如果这有用,但它基本上是我在我之前的问题和Oleg的解决方案中写的。想法?

1 个答案:

答案 0 :(得分:1)

首先,我建议您使用jqGrid的最后4.1.2版本而不是非常旧的4.0.0版本(问题中包含的jquery.jqGrid.src.js的行号来自v4。 0.0)。版本4.1.2包含许多错误修复。

您遇到问题的原因如下。可以使用jQuery.ajaxcompletesuccesserror事件处理程序来处理服务器响应。旧的jqGrid代码到处使用complete事件处理程序。这不是最好的方式,因此在许多地方但并非无处不在(!!!)jqGrid代码已更改,并且主要不使用successerror处理程序。在complete处理程序内部,data参数具有string类型(在您的情况下为JSON格式)。因此,需要额外调用$.parseJSON来将数据转换为对象。 success内部已处理data对应于服务器响应的“Content-Type”HTTP标头和dataType的{​​{1}}参数。

可以在jqGrid的源代码中找到$.ajax将在buildSelect处理程序内的filterToolbar内调用,它将在createEl内部调用complete处理程序。这是你遇到的问题。

我建议您在trirand forum中将问题描述发布为错误报告,或者我可以为您完成。

作为解决方法,我建议修改success功能(我在前一个问题的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>'; }; 输入参数的类型。在更改之后,代码应该适用于所有情况,如果将jqGrid更改为在任何地方使用data处理程序而不是success处理程序,它仍然有效。