【问题标题】:jqGrid EditRow ErroFunc Callback UsagejqGrid EditRow ErroFunc 回调用法
【发布时间】:2017-11-10 16:56:05
【问题描述】:

我正在使用 jqGrid 4.13.3 - 免费。

我需要使用 editRow 的 errofunc 回调,但在访问表单(页面)时出现 JavaScript 错误,显示预期为“)”。在代码中,我让 cmets 解释什么是有效的,然后进行了导致错误的更改。

function oSelect(id, status, e) {
  selID = id;
  rejflag = $("#kcdimensionlist").getRowData(id)['rejectedi'];
  $("#kcdimensionlistV7").setColProp('rejectedi', {
    editoptions: {
      dataUrl: '/QMSWebApp/GenericControllerServlet?lifecycle=twowayoptionlist'
    },
    defaultValue: 0
  });
  $("#kcdimensionlistV7").setColProp('rechecki', {
    editoptions: {
      dataUrl: '/QMSWebApp/GenericControllerServlet?lifecycle=threewayoptionlist_NA'
    },
    defaultValue: 0
  });

  var target = $(e.target);

  if (!target.is("img")) {

    if (id && id !== lastsel) {
      $("#kcdimensionlistV7").jqGrid('restoreRow', lastsel);

      //This line works fine but when commented out and modified to next line it fails
      //$("#kcdimensionlistV7").jqGrid('editRow',id,true);
      $("#kcdimensionlistV7").jqGrid('editRow', id, true, errorfunc: eFunc);
      lastsel = id;
    }

  }
};

这是我的eFunc 函数:

function eFunc(response, rowid) {
  var res = $.parseJSON(response.responseText);
  if (res) {
    if (!res.errorCode) {
      return [false, res.errorMsg];
    } else {
      return [true];
    }
  }
}

更新代码:

function oSelect(id, status, e) {
  selID = id;
  rejflag = $("#kcdimensionlist").getRowData(id)['rejectedi'];
  $("#kcdimensionlistV7").setColProp('rejectedi', {
    editoptions: {
      dataUrl: '/QMSWebApp/GenericControllerServlet?lifecycle=twowayoptionlist'
    },
    defaultValue: 0
  });
  $("#kcdimensionlistV7").setColProp('rechecki', {
    editoptions: {
      dataUrl: '/QMSWebApp/GenericControllerServlet?lifecycle=threewayoptionlist_NA'
    },
    defaultValue: 0
  });

  var target = $(e.target);

  if (!target.is("img")) {

    if (id && id !== lastsel) {

      $("#kcdimensionlistV7").jqGrid('restoreRow', lastsel);

      $("#kcdimensionlistV7").jqGrid('editRow', id, {
        keys: true,
        errorfunc: eFunc
      });
      lastsel = id;
    }

  }
};

function eFunc(response, rowid) {
  alert("Here");
  var res = $.parseJSON(response.responseText);
  if (res) {
    alert(res.errorCode);
    if (!res.errorCode) {
      return [false, res.errorMsg];
    } else {
      return [true];
    }
  }

}

这是我用于测试的 servlet 代码:

else if (lifecycle.equals("editdimensiondatamodelV7")) {

  boolean status = false;
  String returnMsg = "This is a test";


  if (request.getParameter("oper").equals("edit")) {



  }


  jReturnString = "{\"errorCode\": " + status + ", \"errorMsg\": \"" + returnMsg + "\"}";
  response.getWriter().write(jReturnString);

}

更新:

错误函数代码:

function eFunc(res, rowid) {
  var errorText = $.parseJSON(res.responseText).Message;

  alert("Here: " + errorText);
  return [false];
}

Servlet 代码注释注释:

else if (lifecycle.equals("editdimensiondatamodelV7")) {
  //Would like to send a dynamic message back - Example: Dimensions are ouside of tolerance     

  if (request.getParameter("oper").equals("edit")) {
    response.setStatus(500);
  }
}

eFunc 永远不会返回警报,并且一个正在发送...对话框出现在网格上。

【问题讨论】:

  • eFunc 根本没有被调用。
  • errorfunc 与 jqGrid 或 jQuery 的所有其他回调一样,只有在服务器响应具有 HTTP 错误代码 (>=400) 时才会被调用。例如,您可以使用response.setStatus(500)(或response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)。
  • @Oleg:我确实触发了 errorFunc。但这不是我所期望的。我想将编辑数据发送到 servlet,如果它不符合某些条件,我想将消息发送回调用者。最好使用内联 editRow 方法。
  • 通常只需将用户编辑的任何数据发送到服务器。您的服务器代码进行验证并进行更改或返回用户可以理解的错误描述。如果服务器返回成功的 HTTP 代码,则 jqGrid 进行了更改,否则 - 它调用 errorfunc 并为用户显示错误消息。
  • @Oleg:所以我在服务器上使用 response.setStatus(500) 来触发 errorfunc,但是如何将我在服务器上创建的消息发送回 errorfunc。我得到 errorfunc 收到响应,但是如何在响应中获取消息并在 errorfunc 触发时从响应中读取它?

标签: javascript java free-jqgrid


【解决方案1】:

您应该修复包含语法错误的行

$("#kcdimensionlistV7").jqGrid('editRow',id,true, errorfunc: eFunc);

$("#kcdimensionlistV7").jqGrid('editRow', id, {
    keys: true,
    errorfunc: eFunc
});

我建议您将旧的 jqGrid 4.13.3 升级到当前的免费 jqGrid 版本:4.15.2。

【讨论】:

  • 我现在已经升级到 4.15.2。但是,我有用于调用各种函数的自定义图标的列现在不显示为图形图标,而是显示为文字 html 代码。
  • @SteveDyke:您的主要问题与免费 jqGrid 的版本无关。只有当您展示您遇到的问题时,我才能帮助您解决新问题。您能否提供演示,它显示了问题。
  • 解决最初的问题。我已经恢复到 4.13.3
  • @SteveDyke:我有一个假设。可能您在服务器端渲染了一些 HTML 片段,并将 HTML 片段包含在从服务器返回的 JSON/XML 响应中?在这种情况下,您应该在更新到版本 4.15.2 后添加 autoencode: false 选项。有关详细信息,请参阅免费 jqGrid 4.15.0 的 README。
  • 是的,我正在使用 JSON。这是我在回调中作为列数据之一发送的示例, iconlink = iconlink + "" ;我确实尝试将自动编码为 false 和 true 但结果相同:列中显示文字代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多