对jQuery处理我的数据感到困惑
所以可能不是最好的标题,但我认为这就是正在发生的事情 我写这篇文章是想在我的jqGrid中填充一个dropdownlist,这样用户就可以从可用的选择中进行筛选。提供的解决方案在一个实例中有效,但在另一个实例中无效。它检索数据的第一种类型(用于列标题下拉筛选器)my stack trace如下所示:对jQuery处理我的数据感到困惑,jquery,asp.net-mvc,jqgrid,Jquery,Asp.net Mvc,Jqgrid,所以可能不是最好的标题,但我认为这就是正在发生的事情 我写这篇文章是想在我的jqGrid中填充一个dropdownlist,这样用户就可以从可用的选择中进行筛选。提供的解决方案在一个实例中有效,但在另一个实例中无效。它检索数据的第一种类型(用于列标题下拉筛选器)my stack trace如下所示: callback() jquery-1.6.2.js (line 7947) _ = readystatechange done() jquery-1.6.2.js (line 7183) sta
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工具栏过滤器对话框),堆栈跟踪略有不同:
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)
在第二个实例中,它执行以下行:
deferred.resolveWith { callbackContext, [success, statusText, jqXHR] ); (line 7168)
completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText] ); (line 7183)
第二次调用控制器操作时,缓存或处理的方式似乎有所不同。如果有帮助的话,我可以发布额外的代码,但这基本上是我在前面的问题以及Oleg的解决方案中所写的。想法?首先,我建议您使用jqGrid的最新4.1.2版本,而不是非常旧的4.0.0版本(您在问题中包含的
jquery.jqGrid.src.js
的行号来自v4.0.0)。版本4.1.2包括许多错误修复
您遇到问题的原因如下。可以使用的complete
或success
和error
事件处理程序来处理服务器响应。旧的jqGrid代码到处使用complete
事件处理程序。这不是最好的方法,所以在很多地方,但不是所有地方(!!!)jqGrid代码都被更改了,并且大多数情况下没有使用success
和error
处理程序。在complete
处理程序中,data
参数具有string
类型(在您的示例中为JSON格式)。因此,需要进行额外的调用以将数据转换为对象。在success
内部,数据
已被处理,对应于服务器响应的“Content Type”HTTP头和$.ajax的数据类型
参数
可以在jqGrid的源代码中找到,buildSelect
将在complete
处理程序中调用,它将在success
处理程序中调用。这是你的问题
我建议您将问题的描述作为错误报告发布在中,或者我可以为您这样做
作为解决方法,我建议将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>';
};
my.buildSelect=函数(数据){
var响应=类型(数据)=“字符串”?
jQuery.parseJSON(data.responseText):
数据,
s='',i,l,ri;
if(响应和响应长度){
对于(i=0,l=response.length;i首先,我建议您使用jqGrid的最后4.1.2版本,而不是非常旧的4.0.0版本(您在问题中包含的jquery.jqGrid.src.js
的行号来自v4.0.0)。版本4.1.2包含许多错误修复
出现此问题的原因如下。可以使用的complete
或success
和error
事件处理程序来处理服务器响应。旧的jqGrid代码在任何地方都使用complete
事件处理程序。这不是最好的方法,因此在许多地方,但不是在任何地方(!!!)jqGrid代码已更改,并且大部分未使用success
和error
处理程序。在complete
处理程序中,数据
参数具有字符串
类型(在本例中为JSON格式)。因此,需要额外调用来将数据转换为对象。success
中的数据
已被处理,对应于服务器响应的“Content Type”HTTP头和$.ajax
的数据类型
参数
在jqGrid的源代码中可以发现,buildSelect
将在complete
处理程序中调用,它将在success
处理程序中调用。这就是您遇到的问题
我建议您将问题的描述作为错误报告发布在中,或者我可以为您这样做
作为解决方法,我建议将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>';
};
my.buildSelect=函数(数据){
var响应=类型(数据)=“字符串”?
jQuery.parseJSON(data.responseText):
数据,
s='',i,l,ri;
if(响应和响应长度){
对于(i=0,l=response.length;我感谢你的鼓励和洞察力Oleg。我在你的帮助下完成了这项工作。调试这些东西可能非常困难(至少对我来说)当它陷入代码的杂草中时,我没有写,也没有真正理解所有的代码。感谢你对jqGrid和jQuery如此精通。谢谢!@itsmart:不客气!谢谢你对我说的好话。谢谢你的鼓励和洞察力Oleg。我在你的帮助下完成了这项工作。这可能非常困难当这些东西陷入我没有写的代码的杂草中时,我会调试它们(至少对我来说是这样)。感谢你对jqGrid和jQuery如此精通。谢谢!@itsmart:不客气!谢谢你对我说的好话。