Невозможно заставить saveRow после сохранения или успеха работать - PullRequest
0 голосов
/ 30 июня 2011

У меня есть некоторый код, который при переключении выбранной строки запускает сохранение ранее выбранной строки.

Строка успешно сохраняется без каких-либо проблем, однако 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 Ответ

1 голос
/ 30 июня 2011

Я не вижу места кода, где определены переменные responseData. Код responseData[0] должен выдавать исключение, поэтому console.log("Data: " + responseData[0]); не будет отображать никаких данных. Строка кода, вероятно, должна быть зафиксирована как

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

ОБНОВЛЕНО : Не имея данных для обеих сеток и, например, подсетки, соответствует первой строке, в которой невозможно отладить код. Чтение не так эффективно. Если вы разместили тестовые данные (два файла XML), я мог бы попытаться локализовать проблему.

Важной ошибкой является то, что вы объявляете только переменную subgrid_table_id, но не присваиваете ей значение. Обычно одна конструкция создает уникальное имя идентификатора subgrid_table_id на основе subgrid_id. Например

var subgrid_table_id = subgrid_id+"_t";

вместо var subgrid_table_id; только.

Тем не менее некоторые вещи я нахожу немного подозреваемыми:

  1. Я не понимаю, почему вы возвращаете return false; из successfunc. Это означает, что вы интерпретируете ответ сервера как ошибку, и обычные действия при успешном ответе сервера должны быть прерваны. Я бы порекомендовал вам дополнительно использовать errorfunc параметр saveRow . В моем коде сервера сервер всегда возвращает HTML-код ошибки в случае ошибки сервера. Поэтому мне никогда не нужно использовать successfunc и использовать только aftersavefunc и errorfunc.
  2. У подсетки есть много столбцов, которые уже существуют в соответствующей строке родительской сетки. Потенциальные проблемы здесь - не только расход дополнительной памяти. Вы не разместили данные сетки, и поэтому я не знаю, какие значения вы используете в качестве строк для сеток. Очень важно не иметь дубликатов идентификаторов на странице HTML. Поэтому вы должны быть осторожны в этом вопросе. Зачем тебе надо? Возможно, вы можете просто использовать extraparam параметр saveRow и editRow вместо использования скрытых столбцов phrase_id, translation_id и language_cd, имеющих свойства editable: true, editrules: { edithidden :true }, hidden: true?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...