1

edittype: select使用和编辑列时multiple: true,jqGrid 将数据作为逗号分隔值发送到服务器。是否可以将某些事件绑定到此特定列,该列将返回一个数组而不是逗号分隔值?

我想避免使用serializeEditData事件,因为

  1. 这是特定于网格的,而不是特定于列的,这对我来说很麻烦-我正在尝试将列逻辑与网格逻辑分开
  2. 将数组转换为字符串,然后再将字符串转换为同一个数组,这听起来不是一个好主意。
4

1 回答 1

2

我认为您将不得不edittype: 'custom'在案例中使用并提供您的自定义实现custom_elementcustom_value方法editoptions。如果需要读取来自自定义输入元素的值,jqGrid 将custom_value使用参数参数调用方法'get'。您的custom_value方法实现可能会返回案例中的项目数组。

重要的是要了解,通常您需要实现自定义格式化程序,它允许显示为多选输入的数据数组。幸好formatter: "select"线路

cellval = cellval + "";

它将数组转换为逗号分隔的项目。由于该行,数组将通过使用转换为字符串.join(",")formatter: "select"成功接受数组作为输入。

演示

在此处输入图像描述

演示了上述方法。它使用以下代码:

{
    name: "Subcategory",
    width: 250,
    formatter: "select",
    edittype: "custom",
    editoptions: {
        value: {"1": "football", "2": "formula 1", "3": "physics", "4": "mathematics"},
        custom_element: function (value, options) {
            return $.jgrid.createEl.call(this, "select",
                $.extend(true, {}, options, {custom_element: null, custom_value: null}),
                value);
        },
        custom_value: function ($elem, operation, value) {
            if (operation === "get") {
                return $elem.val();
            }
        },
        multiple: true
    }
}

在上面的代码中,我使用$.jgrid.createEljqGrid 的现有代码创建多值选择。唯一需要做的就是从选项中移除custom_element和移除custom_value选项,以防止从setAttributes不必要地调用方法。如果修改代码并在排除属性列表中包含和,则表达式可以简化为.setAttributes"custom_value""custom_element"$.extend(true, {}, options, {custom_element: null, custom_value: null})options

我们得到的方式几乎与<select>使用edittype: "select". 只有两个区别:

  • 在其中创建的<select>元素edittype: "custom"将具有附加属性class="customelement"
  • 内部创建的<select>元素edittype: "custom"将被包裹(将是直接子元素)内部<span class="editable">...</span>

在我们的案例中,这种差异似乎并不重要。

更新setAttributes方法的代码现在固定在 gtihub 上 jqGrid 的主要代码中(参见建议提交)。所以在 jqGrid 的下一个版本(4.4.1 更高版本)中,可以将代码减少custom_element

custom_element: function (value, options) {
    return $.jgrid.createEl.call(this, "select", options, value);
}

请参阅相应的演示

于 2013-01-18T21:47:16.940 回答