jqGrid - 复选框编辑无法编辑所选行

2023-12-07

在我的 jqGrid 中,我有一个也可用于编辑的复选框,即用户可以单击该复选框,并且该复选框的值将在数据库中更新。效果很好。但是,当我单击该复选框并尝试再次单击它时,什么都没发生。该行不会被保存。理论上应该保存复选框未选中的值。但这并没有发生。

我尝试过参考this奥列格的回答但这没有帮助。

奇怪的问题是,如果我选择另一行,然后尝试再次取消选择该复选框,我确实会看到保存请求。

我猜这是因为我正在尝试编辑当前选定的行。但我不确定我在这里做错了什么。

这就是我正在做的事情beforeSelectRow

beforeSelectRow: function (rowid, e) {
    var $target = $(e.target),
        $td = $target.closest("td"),
        iCol = $.jgrid.getCellIndex($td[0]),
        colModel = $(this).jqGrid("getGridParam", "colModel");
    if (iCol >= 0 && $target.is(":checkbox")) {
        if (colModel[iCol].name == "W3LabelSelected") {
            console.log(colModel[iCol].name);
            $(this).setSelection(rowid, true);
            $(this).jqGrid('resetSelection');
            $(this).jqGrid('saveRow', rowid, {
                succesfunc: function (response) {
                    $grid.trigger('reloadGrid');
                    return true;
                }
            });
        }
    }
    return true;
},

配置:

jqGrid版本:最新免费jqGrid

数据类型:Json 保存到服务器

最小电网代码: jsFiddle

EDIT:在奥列格的回答之后,这就是我到目前为止所得到的:

beforeSelectRow: function (rowid, e) {
    var $self = $(this),
        iCol = $.jgrid.getCellIndex($(e.target).closest("td")[0]),
        cm = $self.jqGrid("getGridParam", "colModel");
    if (cm[iCol].name === "W3LabelSelected") {
        //console.log($(e.target).is(":checked"));
        $(this).jqGrid('saveRow', rowid, {
            succesfunc: function (response) {
                $grid.trigger('reloadGrid');
                return true;
            }
        });
    }

    return true; // allow selection
}

这很接近我想要的。但是,如果我第一次和第二次选中该复选框,console.log每次都会被叫到。但是,那saveRow仅当我选中该复选框,然后再次单击它以取消选中它时,才会被调用,此后就不再调用。默认情况下,可以根据服务器发送的数据选中或取消选中该复选框。

enter image description here

在图中,请求是在选中复选框两次后发送的,而不是每次都发送。

UPDATE:根据@Oleg的建议,我已经实施了cellattr并在里面调用了一个函数。在函数中,我只需传递 rowid 并更新服务器上该 rowid 的复选框。

这是我使用的代码:

{
    name: 'W3LabelSelected',
    index: 'u.W3LabelSelected',
    align: 'center',
    width: '170',
    editable: false,
    edittype: 'checkbox',
    formatter: "checkbox",
    search: false,
    formatoptions: {
        disabled: false
    },
    editoptions: {
        value: "1:0"
    },
    cellattr: function (rowId, tv, rawObject, cm, rdata) {
        return ' onClick="selectThis(' + rowId + ')"';
    }
},

和我的 selectThis 函数:

function selectThis(rowid) {
    $.ajax({
        type: 'POST',
        url: myurl,
        data: {
            'id': rowid
        },
        success: function (data) {
            if (data.success == 'success') {
                $("#list").setGridParam({
                    datatype: 'json',
                    page: 1
                }).trigger('reloadGrid');
            } else {
                $("<div title='Error' class = 'ui-state-error ui-corner-all'>" + data.success + "</div>").dialog({});
            }
        }
    });
}

FIDDLE


我认为使用上有一个误区formatter: "checkbox", formatoptions: { disabled: false }。如果您以这种方式在网格列中创建非禁用复选框,那么用户只会看到该复选框,可以单击该复选框并可以更改其状态。另一方面什么都没发生如果用户更改复选框的状态。相反,复选框的初始状态对应于网格的输入数据,但是更改后的复选框会产生状态已更改的错觉,但不会自动执行任何操作。即使你使用datatype: "local"什么也没有发生,甚至本地数据也会在单击时更改。如果您确实需要根据更改复选框状态来保存更改,那么您必须实现额外的代码。答案演示了一种可能的实现。您可以更改某些复选框的状态对应的演示,然后更改页面并返回第一页。您将看到复选框的状态对应于最新的更改。

Now let us we try to start inline editing (start editRow) on select the row of the grid. First of all inline editing get the values from the rows (editable columns) using unformatter, saves the old values in internal savedRow parameter and then it creates new editing controls inside of editable cells on the place of old content. Everything is relatively easy in case of using standard disabled checkbox of formatter: "checkbox". jqGrid just creates enabled checkboxs on the place of disabled checkboxs. The user can change the state of the checkboxs or the content of any other editable columns and saves the changes by usage of Enter for example. After that the selected row will be saved and will be not more editable. You can monitor the changes of the state of the checkbox additionally (by usage editoptions.dataEvents with "change" event for example) and call saveRow on changing the state. It's important that the row will be not editable after the saving. If you do need to hold the row editable you will have to call editRow once more after successful saving of the row. You can call editRow inside of aftersavefunc callback of saveRow, but I recommend you to wrap the call of editRow inside of setTimeout to be sure that processing of previous saving is finished. It's the way which I would recommend you.

另一方面,如果你尝试结合enabled的复选框formatter: "checkbox"使用内联编辑,您将进行更复杂的处理。首先可以更改启用的复选框,这一点很重要before处理的onclick and onchange事件处理程序。 3个事件的顺序(改变复选框的状态,处理onclick和处理onchange) 在不同的网络浏览器中可能会有所不同。如果方法editRow正在执行它使用复选框格式化程序的取消格式化程序来获取当前的复选框的状态。基于国家的价值editRow将单元格的内容替换为另一个启用的复选框的内容。复选框的状态可能已经更改,但是editRow解释the changes state like the initial state的复选框。以同样的方式可以调用saveRow only after editRow。所以你不能只使用saveRow代替change的处理程序formatter: "checkbox", formatoptions: { disabled: false },因为该行尚未处于编辑模式。

UPDATED:相应的实现(如果使用formatter: "checkbox", formatoptions: { disabled: false }) 可以是以下内容:

editurl: "SomeUrl",
beforeSelectRow: function (rowid, e) {
    var $self = $(this),
        $td = $(e.target).closest("tr.jqgrow>td"),
        p = $self.jqGrid("getGridParam"),
        savedRow = p.savedRow,
        cm = $td.length > 0 ? p.colModel[$td[0].cellIndex] : null,
        cmName = cm != null && cm.editable ? cm.name : "Quantity",
        isChecked;
    if (savedRow.length > 0 && savedRow[0].id !== rowid) {
        $self.jqGrid("restoreRow", savedRow[0].id);
    }
    if (cm != null && cm.name === "W3LabelSelected" && $(e.target).is(":checkbox")) {
        if (savedRow.length > 0) {
            // some row is editing now
            isChecked = $(e.target).is(":checked");
            if (savedRow[0].id === rowid) {
                $self.jqGrid("saveRow", rowid, {
                    extraparam: {
                        W3LabelSelected: isChecked ? "1" : "0", 
                    },
                    aftersavefunc: function (response) {
                        $self.jqGrid("editRow", rowid, {
                            keys: true,
                            focusField: cmName
                        });
                    }
                });
            }
        } else {
            $.ajax({
                type: "POST",
                url: "SomeUrl", // probably just p.editurl
                data: $self.jqGrid("getRowData", rowid)
            });
        }
    }
    if (rowid) {
        $self.jqGrid("editRow", rowid, {
            keys: true,
            focusField: cmName
        });
    }

    return true; // allow selection
}

请参阅 jsfiddle 演示http://jsfiddle.net/OlegKi/HJema/190/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jqGrid - 复选框编辑无法编辑所选行 的相关文章

  • 基于布尔 prop 的条件字段验证

    我想要favoriteAlcohol仅当以下情况时才需要验证 需要的字段props isAdult传递给组件的是true Yup object shape favoriteAlcohol Yup string when props isAd
  • JavaScript 设置滚动高度

    在 JavaScript 中 将一个元素的滚动高度设置为另一个元素的滚动高度的正确方法是什么 直接赋值没有效果 谢谢 格雷格 直接是不可能的 scrollHeight 是一个只读属性 包含元素内容的总高度 以像素为单位 如果有元素 A 并且
  • 三 JS 网格在模型的另一侧可见

    所以我使用在 Blender 中为 ThreeJS 制作的自定义模型 我将其导出为 obj 文件 并使用 Three js 转换实用程序创建 json 文件 我将其设置为旋转 当它旋转时 您可以看到模型的另一侧 这是我用来加载它的代码 lo
  • @deprecated 的 mergeLatest 重构 - 不再支持 resultSelector,而是通过管道传输到映射吗?

    角度材料文档应用程序包含以下代码片段 Combine params from all of the path into a single object this params combineLatest this route pathFro
  • 如何获取node.js中调用函数的文件路径?

    以下是来自三个文件的一些示例代码 foo js var myFunc require myFunc function foo myFunc message bar js var myFunc require myFunc function
  • JavaScript 在对象中创建数组并将数据推送到数组

    我是编程新手 我正在尝试 React 并具有函数 addComment 当用户向新闻添加评论时执行该函数 此时我需要创建一个属性comments 数组 并分配或推送到该数组输入评论值价值 但现在我只重写了数组的 0 个元素 无法添加新元素
  • Photoswipe + JQM:返回事件问题

    document on pagecreate function jsonp url URL TO GET JSONP callbackParameter get photo success function json status var
  • Apex 图表自定义工具提示 - 如何获取类别名称和颜色?

    我想在 Apex Charts 中创建自定义工具提示 以下是官方文档中的建议 tooltip custom function series seriesIndex dataPointIndex w return div class arro
  • Angularjs 中的动态表单名称属性

    当动态创建 inputName 时 人们将如何使用 formName inputName valid
  • 从文件中抓取随机行

    我不知道该怎么做 我应该从哪里开始 我用谷歌搜索了这个 但没有找到关于如何从文本文件中提取随机行的结果 我唯一发现的是https github com chrisinajar node rand line https github com
  • JavaScript 检查 null 与 undefined 以及 == 和 === 之间的区别

    如何检查变量是否null or undefined和有什么区别null and undefined 有什么区别 and 很难在 Google 上搜索 如何检查变量是否null or undefined 是变量null if a null o
  • 从 jsonp fetch Promise 获取 json

    我刚刚开始使用react native 并且我正在以文档中的经典示例作为基础 fetch https facebook github io react native movies json then response gt response
  • 通过 Scriptaculous 拖放防止 JavaScript 点击事件

    我的页面上有一些可拖动的元素 这些相同的元素有一个导航到另一个页面的点击事件 我试图确定在用户拖动时防止触发单击事件的最佳方法 但如果不拖动则仍然允许单击事件 有人对实现这一目标的最佳方法有任何想法吗 我通过使用类似以下内容解决了这个问题
  • 在 React 中渲染来自 Firebase 的数据

    请帮助我渲染从 Firebase 实时数据库检索的数据 我成功从 Firebase 中以数组形式检索数据 下一步是显示数据 问题就从这里开始了 我想要显示的数据应该存储在 模块 状态 首先 它被设置为一个空数组 然后检索数据 通过 Coum
  • Javascript 选择器中的实时收集和非实时收集有什么区别?

    我怎么知道现场采集和非现场采集有什么区别 根据我的研究 A liveis 当 DOM 中的更改反映在集合中时 当节点修改时 内容也会发生变化 A Not Liveis 当 DOM 中的任何更改都不会影响集合的内容时 document get
  • jquery mousewheel:检测轮子何时停止?

    我正在使用 Jquery鼠标滚轮 http plugins jquery com project mousewheel插件 我希望能够检测用户何时完成使用轮子 与可拖动内容中的 stop 事件类似的功能 有人能指出我正确的方向吗 这里真的没
  • 检测 html 元素内的用户选择

    如何检测用户选择 用鼠标突出显示 是否在某个元素内 某个元素的子元素 Example div sdfsdf div some span content span div sdfsd div 伪代码 if window getSelectio
  • 将 javascript 对象分配给 html 元素的最佳方法

    我通过 ajax 获取一个 javascript 对象 我需要将此对象附加到 div 以便稍后恢复 例如 在单击事件上 如果我有一个变量而不是一个对象 我会将它推入 html 标签 如下所示 div div 我会像这样恢复它的价值 var
  • NESTJS AWS Lambda 和 Sequelize 连接池

    由于我已经给出了下面代码片段中提到的池参数 因此是否有必要在每次 lambda 调用后关闭连接 这个 aws lambda 函数应该每分钟触发一次 池参数仅足以关闭连接吗 export const databaseProviders pro
  • Bootstrap轮播不滑动

    我一直在尝试使用 Bootstrap Carousel 并在一定程度上取得了成功 我也可以单击并更改图像 但我有一个问题 只是不滑动而已 我哪里做错了 html div class carousel slide ol class carou

随机推荐