很可能不是最好的头衔,但这就是我的想法。
我写了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的解决方案中写的。想法?
答案 0 :(得分:1)
首先,我建议您使用jqGrid的最后4.1.2版本而不是非常旧的4.0.0版本(问题中包含的jquery.jqGrid.src.js
的行号来自v4。 0.0)。版本4.1.2包含许多错误修复。
您遇到问题的原因如下。可以使用jQuery.ajax的complete
或success
和error
事件处理程序来处理服务器响应。旧的jqGrid代码到处使用complete
事件处理程序。这不是最好的方式,因此在许多地方但并非无处不在(!!!)jqGrid代码已更改,并且主要不使用success
和error
处理程序。在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
处理程序,它仍然有效。