无法获得saveRow aftersavefunc或successFunc工作

时间:2011-06-30 15:38:51

标签: javascript jquery jqgrid

我有一些代码,当选择切换哪一行时,它会触发先前所选行的保存。

该行成功保存没有任何问题,但是successfunc根本没有被调用 - 我的console.log输出从未显示,并且此函数中的代码未运行。我也尝试将函数指定为aftersavefunc,但无法使其工作。

看起来像一个简单的语法问题,但我不能完全正确。我没有正确指定此功能吗?

作为旁注,我意识到在一行保存之后重新加载整个网格似乎有些过分,但在这个特定代码片段的上下文中,在我的应用程序的更大结构中,这段代码是一个特例。

完整的jqGrid代码是:

var lastSelectedMainGridRowID = 0;
var lastSelectedSubGridRowID = 0;
var translationsFeed = "/update/translations/ajax/translations_feed.php";
var translationsEdit = "/update/translations/ajax/translations_edit.php";
var translationsSubGridFeed = "ajax/translations_subgrid_feed.php";
var translationsSubGridFeedEdit = "ajax/translations_subgrid_feed_edit.php";

$(document).ready(function () {
$("#translationsList").jqGrid({
    caption : "Translations",
    datatype : "xml",
    url : translationsFeed,
    editurl : translationsEdit,
    mtype : "get",
    pager : "#translationsPager",
    rowNum : 20,
    autowidth : true,
    sortname : "phrase",
    sortorder : "asc",
    viewrecords : true,
    multiselect : false,
    hidegrid : false,
    height : 300,
    altRows : true,
    rownumbers : true,
    toolbar : [false],
    loadComplete: function(data) {
        jQuery("#translationsList").setSelection (0, true);
    },
    colNames : ["phrase_id", "translation_id", "language_cd", "Phrase", "Translation", "Modified", "Created", "Active"],
    colModel : [
            { name : "phrase_id",                                   index : "phrase_id",            sortable : true,    search : false, editable: true, edittype : "text",      editrules: { edithidden: true },                                    hidden: true},
            { name : "translation_id",                          index : "translation_id", sortable : false, search : false, editable: true, edittype : "text",      editrules: { edithidden: true },                                    hidden: true},
            { name : "language_cd",                                 index : "language_cd",      sortable : true,    search : true,  editable: true, edittype : "text",      editrules: { edithidden: true, required : true }, hidden: true },
        { name : "Phrase",              width:200,  index : "phrase",               sortable : true,    search : true,  editable: true, edittype : "text",      editrules: { required: true } },
        { name : "Translation",         width:200,  index : "translation",      sortable : true,    search : true,  editable: true, edittype : "text",      editrules: { required: false } },
        { name : "Modified",            width:100,  index : "modify_dt",            sortable : true,    search : true },
        { name : "Created",             width:100,  index : "create_dt",            sortable : true,    search : true },
        { name : "Active",              width:20,       index : "active",               sortable : true,    search : true,  editable: true, edittype: "checkbox", editoptions: {value:"Yes:No", checked: true} }
    ],
    onSelectRow: function(id) {
            jQuery('#translationsList').jqGrid('saveRow', lastSelectedMainGridRowID);
            jQuery('#translationsList').jqGrid('editRow', id, true);
            lastSelectedMainGridRowID = id;
    },
    subGrid: true,
    subGridRowExpanded: function(subgrid_id, row_id) {
        var subgrid_table_id;
        jQuery("#"+subgrid_id).html("<table id='"+subgrid_table_id+"' class='scroll'></table>");
        jQuery("#"+subgrid_table_id).jqGrid({
            url: translationsSubGridFeed + "?phrase_id=" + row_id,
            editurl: translationsSubGridFeedEdit,
            datatype: "xml",
            colNames: ['phrase_id', 'translation_id', 'language_cd', 'Translations', 'Language', 'Active'],
            colModel: [
                            {name:"phrase_id",          index:"phrase_id",          sortable: false,    editable: true,     edittype : "text", editrules: { edithidden :true },                             hidden: true},
                            {name:"translation_id", index:"translation_id", sortable: false,    editable: true,     edittype : "text", editrules: { edithidden :true },                             hidden: true},
                            {name:"language_cd",        index:"language_cd",        sortable: false,    editable: true,     edittype : "text", editrules: { edithidden :true },                             hidden: true},                          
                    {name:"Translation",        index:"translation",        sortable: true,     editable: true,     edittype:"text",                                                                                                    width:589},
                {name:"Language",               index:"language_disp",  sortable: true,     editable: false,                                                                                                                                        width:250},
                {name:"Active",                 index:"active",                 sortable: true,     editable: true,     edittype:"checkbox", editoptions:{value:"Yes:No", checked: true}, width:80}
            ],
            height: "100%",
            rowNum:20,
            sortname: 'language_cd',
            sortorder: "asc",
            onSelectRow: function(id) {
                jQuery("#"+subgrid_table_id).jqGrid('saveRow', lastSelectedSubGridRowID, function(response) {
                  console.log("Data: " + response.responseText);
                  return false;
                });
                jQuery("#"+subgrid_table_id).jqGrid('editRow', id, true);
                lastSelectedSubGridRowID = id;
            }
        });
    }

});

也许我不需要使用saveRow。在这种情况下,我正在做的是:

  1. 当您点击某行时,它会变为可编辑
  2. 如果您再单击第二行,则保存第一行(并且不再选中),然后新的第二行变为可编辑。与保存一行“onBlur”类似,可以这么说。

1 个答案:

答案 0 :(得分:1)

我没有看到定义responseData变量的代码的位置。代码responseData[0]应抛出异常,因此console.log("Data: " + responseData[0]);不会显示任何数据。代码行应该可以修改为

console.log("Server response: " + result.responseText);

UPDATED :如果没有两个网格的数据,例如子网格对应第一行,则无法调试代码。阅读不是那么有效。如果您发布了测试数据(两个XML文件),我可以尝试本地化问题。

一个重要的错误是您只声明subgrid_table_id变量,但没有为其赋值。通常,根据subgrid_table_id构建唯一ID名称subgrid_id。例如

var subgrid_table_id = subgrid_id+"_t";

而不是var subgrid_table_id;

尽管我发现有些事情有点怀疑:

  1. 我不明白为什么你从return false;返回successfunc。这意味着您将服务器响应解释为错误,并且应该中断对成功服务器响应的正常操作。我建议您另外使用saveRowerrorfunc参数。在我的服务器代码中,服务器始终返回错误HTML状态代码,以防服务器出错。因此,我永远不需要使用successfunc并仅使用aftersavefuncerrorfunc
  2. 子网格有许多列已存在于父网格的相应行中。这里潜在的问题不仅仅是花费额外的内存。您没有发布网格数据,因此我不知道您使用哪些值作为网格的rowid。在HTML页面上没有id重复是非常重要的。所以你应该小心这个主题。你为什么需要?可能您只能使用saveRoweditRowextraparam参数,而不是使用phrase_idtranslation_idlanguage_cd隐藏列{{3}} 1}}属性?