【问题标题】:Confused about jQuery handling of my data对 jQuery 处理我的数据感到困惑
【发布时间】:2011-07-29 12:41:59
【问题描述】:

可能不是最好的标题,但我认为这就是发生的事情。

我写了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 的解决方案中所写的。想法?

【问题讨论】:

    标签: jquery asp.net-mvc jqgrid


    【解决方案1】:

    首先,我建议您使用最新的 4.1.2 版本的 jqGrid 而不是非常旧的 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 标头和$.ajaxdataType 参数。

    在jqGrid的源码中可以看到,buildSelect会在completehandler里面的filterToolbar里面调用,在successhandler里面的createEl里面会调用buildSelect。这是你的问题。

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

    作为解决方法,我建议将 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 更改为在任何地方使用success 处理程序而不是complete 处理程序,它仍然可以工作。

    【讨论】:

    • 感谢您的鼓励和洞察奥列格。在你的帮助下我得到了这个工作。调试这些东西(至少对我而言)是非常困难的,因为它陷入了我没有编写的代码的杂草之中,并且没有真正理解得那么好。感谢您如此精通 jqGrid 和 jQuery。谢谢!
    • @itsmatt:不客气!感谢您对我说的好话。
    猜你喜欢
    • 2021-10-22
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多