0

这是我在 jqGrid 中使用的示例删除选项。它工作得很好,我的服务器端脚本工作得很好。记录被删除,但是在收到服务器的响应后出现了问题。

// Del Options
{
    mtype: "POST",
    modal: true,
    url: "/internal/backupmanagement/backupmanager/deleteMySQLDB",
    reloadAfterSubmit: false,
    onclickSubmit: function () {
        var post = $("#grid_" + o.id).jqGrid("getGridParam", "postData");
        var server = post.serverID;
        $.openDialog("load", "Deleting old database entry.  Please wait...");
        var selrow = $("#grid_" + o.id).jqGrid("getGridParam", "selrow");
        var row = $("#grid_" + o.id).jqGrid("getRowData", selrow);
        console.log("about to return", row, server);
        return {
            id: row.recid,
            database: row.database,
            server: server
        };
    },
    afterSubmit: function (response, postdata) {
        response = eval("(" + response.responseText + ")");
        console.log(response);
        return [true, "success"];
    },
    afterComplete: function (response, postdata, formid) {
        response = eval("(" + response.responseText + ")");
        var selrow = $("#grid_" + o.id).jqGrid("getGridParam", "selrow");
        $("#grid_" + o.id).jqGrid("delRowData", selrow);
        if (response.error == 0) {
            $.openDialog("info", "Successfully deleted " + postdata.database + ".");
        } else {
            $.openDialog("info", "And error occured - " + response.msg + ".");
        }
    }
}

在网格中触发 afterComplete 事件之前,我收到以下错误:

Uncaught TypeError: Object [object Array] has no method 'split'

因此,当它期待一个字符串时,似乎有一些东西作为一个对象返回。我不确定我来自服务器的响应格式是否正确,我也无法在文档中找到任何预期的响应。

* 更新 * 请求的服务器端代码。我刚刚包含了与 jqGrid 交互的控制器功能,其余的正在工作并在应用程序中进一步发生。

function deleteMySQLDB()
{
  if (IS_AJAX) {
    if (($this->Application->deleteMySQLDBData(
        $_POST["id"],
        $_POST["database"],
        $_POST["server"]
    )) === false) {
      echo json_encode(
          array(
            "error" => 1,
            "msg"   => "Failed Deleting record from database: "
                       .$this->Application->error
          )
      );
      return false;
    }
    echo json_encode(
        array(
          "error" => 0,
          "msg"   => "success"
        )
    );
    return true;
  } else {
    header("Location: /");
  }
}

我希望这有助于了解我目前正在返回网格。

* 更新 * 我所做的是更改 jqGrid 插件中的源以在执行拆分之前在值上包含一个 toString()。

在 jquery.jqGrid.min.4.3.1 的第 331 行:

var A=[];A=H.split(",");

变成 :

var A=[];A=H.toString().split(",");

这似乎是对事物的宏伟计划的无害改变,并且避免了尝试拆分数组。非常感谢各位的帮助。奥列格,你肯定给我指出了正确的开始寻找的地方!

4

2 回答 2

0

由于您没有包含服务器端代码,因此我猜得很好。

在服务器上,您可以返回如下内容:

return Json(new { success = false, showMessage = true, message = "Error - You can't have a negative value", title = "Error" });

然后在您的客户端上,您可以显示一条消息(在此示例中,如果有错误)

afterComplete: function (response) {
                        var DialogVars = $.parseJSON(response.responseText); //parse the string that was returned in responseText into an object

                        if (!DialogVars.success || DialogVars.showMessage) {
                            showDialog($('#Dialog'), DialogVars.message, DialogVars.title);
                        }
                    } //afterComplete
于 2013-05-02T16:18:10.373 回答
0

假设所描述的错误的来源是您的afterComplete回调代码。我认为您以错误的方式使用它。我不明白代码的某些部分,response.error应该将部分(测试)移入afterSubmit.

如果您检查将调用回调的代码,主要问题就会很清楚。afterComplete它将在setTimeout0.5 秒延迟内执行。当时可以加载(或可能正在加载)网格中的新数据。所以使用类似的方法是错误的,并且现在可以更改delRowData的值。selrow

我强烈建议你另外不要使用eval函数。而不是线

response = eval("(" + response.responseText + ")");

使用是正确的

response = $.parseJSON(response.responseText);

如果您使用回调内部(像大多数其他回调 o jqGrid)被初始化为网格的 DOM 元素的onclickSubmit事实,则可以改进回调代码。this因此,要获得selrow网格选项,您可以使用

var selrow = $(this).jqGrid("getGridParam", "selrow");

代替

var selrow = $("#grid_" + o.id).jqGrid("getGridParam", "selrow");

另一个事实是onclickSubmitjqGrid 将使用两个参数调用:optionspostdata. postdata如果使用不使用,则参数为 rowid multiselect: true。在使用回调参数multiselect: true值的情况下,postdata可以使用逗号分隔的将删除行的行 ID 列表。所以使用 的比使用postdata更好selrow

于 2013-05-02T21:19:35.417 回答