Javascript 保存行仅在编辑行之后。因此,您不能仅在formatter:“checkbox”的change处理程序中使用saveRow,formattoptions:{disabled:false},因为该行尚未处于编辑模式

Javascript 保存行仅在编辑行之后。因此,您不能仅在formatter:“checkbox”的change处理程序中使用saveRow,formattoptions:{disabled:false},因为该行尚未处于编辑模式,javascript,jquery,jqgrid,free-jqgrid,Javascript,Jquery,Jqgrid,Free Jqgrid,更新:相应的实现(如果使用格式化程序:“复选框”,格式化选项:{disabled:false})可以是以下内容: editurl:“SomeUrl”, beforeSelectRow:函数(rowid,e){ var$self=$(此), $td=$(e.target).closest(“tr.jqgrow>td”), p=$self.jqGrid(“getGridParam”), savedRow=p.savedRow, cm=$td.length>0?p.colModel[$td[0].ce

更新:相应的实现(如果使用
格式化程序:“复选框”,格式化选项:{disabled:false}
)可以是以下内容:

editurl:“SomeUrl”,
beforeSelectRow:函数(rowid,e){
var$self=$(此),
$td=$(e.target).closest(“tr.jqgrow>td”),
p=$self.jqGrid(“getGridParam”),
savedRow=p.savedRow,
cm=$td.length>0?p.colModel[$td[0].cellIndex]:空,
cmName=cm!=null&&cm.editable?cm.name:“数量”,
检查;
如果(savedRow.length>0&&savedRow[0].id!==rowid){
$self.jqGrid(“restoreRow”,savedRow[0].id);
}
if(cm!=null&&cm.name==“W3LabelSelected”&&&$(e.target).is(“:复选框”)){
如果(savedRow.length>0){
//某行正在编辑
isChecked=$(e.target).is(“:checked”);
if(savedRow[0].id==rowid){
$self.jqGrid(“保存行”,rowid{
外参数:{
W3LabelSelected:isChecked?:“1”:“0”,
},
aftersavefunc:函数(响应){
$self.jqGrid(“editRow”,rowid{
凯斯:没错,
焦点字段:cmName
});
}
});
}
}否则{
$.ajax({
类型:“POST”,
url:“SomeUrl”//可能只是p.editurl
数据:$self.jqGrid(“getRowData”,rowid)
});
}
}
如果(rowid){
$self.jqGrid(“editRow”,rowid{
凯斯:没错,
焦点字段:cmName
});
}
返回true;//允许选择
}

参见jsfiddle演示

jsfiddle演示不完整与您的问题的描述相对应。此外,您还可以使用
formatoptions:{disabled:false}
,如果不将其与内联编辑结合使用,这通常是很好的。此外,演示程序在选择Row之前使用的是
而不是
。你的真实情况是什么?您是否使用内联编辑?是否有更多的可编辑列作为带有复选框的列?如果用户单击行,单击尚未处于编辑状态的行的复选框,单击处于编辑状态的行的复选框,您需要什么行为?如果您使用
iconSet:“fontAwesome”
设置格式时不使用
,也可能会有所不同。您可以使用网格的
iconSet:“fontAwesome”
选项,添加
模板:“booleanCheckboxFa”
。您将在列中看到已选中或未选中图标的网格,但没有
元素。如果您更喜欢
格式化程序:“复选框”
,那么我想您应该需要删除
格式化选项:{disabled:false}
选项,并对
W3LabelSelected
列使用
“更改”
事件。它允许您在复选框的
“change”
处理程序中调用
saveRow
。若要获取
“change”
处理程序内部的rowid,您可以使用
$(this).closest(“tr.jqgrow”).attr(“id”)
.Hi@Oleg抱歉延迟回复,我周末不在家。我在真实场景中使用内联编辑。通常我知道,
onsetrow
用于内联编辑。但是,我需要一些东西,比如当用户单击复选框时,每次都应该向服务器发送请求以保存该行。这就是为什么我还要在选择行之前使用
,以便在用户单击复选框时立即保存复选框状态。(这是为了减少用户必须进行的点击次数)我检查了我的源代码,并且复选框呈现为
,因此我不确定
iconSet:“fontAwesome”
是否正在对我的复选框的html进行任何更改,我尝试使用
change
事件,但似乎无法使其正常工作。您能举例说明如何使用复选框的更改事件来保存行吗?很抱歉给您添麻烦,但我想不通。谢谢您这么详细的回答。这非常接近我想要的。请参见编辑。如果我在第一次调用
console.log
时选中复选框。但是,只有当我选中复选框,然后再次单击以取消选中时,
saveRow
才会被调用。我在编辑中解释了更多。@DipenShah:不客气!原因如下:在使用
editRow
开始内联编辑之前,尝试调用内联编辑方法
saveRow
。我不建议您将
formatter:“checkbox”
formattoptions:{disabled:false}
editable:true
属性结合使用。@DipenShah:我建议使用
formattoptions:{disabled:false}
editable:true
。如果要删除
formatoptions:{disabled:false}
,则代码将简短而清晰。用户只需单击两次即可更改复选框。如果您希望使用
formatter:“checkbox”,formattoptions:{disabled:false}
,则应该从checkbox列中删除
editable:true
。你的代码会更长。在选择行之前,您应该在
中测试该行是否处于编辑模式。仅当行已处于编辑模式时,才可以使用saveRow@DipenShah:如果行未处于编辑模式,则可以直接对服务器进行jQuery.ajax调用,而无需使用
saveRow
。现在我找到了问题的根源。在这种情况下,如果我决定删除
editable:true
函数
cellattr
是否符合我的目的
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;
},
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
}
{
    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 + ')"';
    }
},
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({});
            }
        }
    });
}