jqGrid отображает собственный диалог с ошибкой celledit - PullRequest
3 голосов
/ 30 августа 2011

Я использую jqGrid для отображения таблиц в моем PHP-приложении. Все это прекрасно работает, но для одной сетки я хочу сделать один конкретный столбец (называемый «цена») встроенным редактируемым.

Что я хочу, так это то, что я хочу создать свой собственный диалоговый экран Jquery-UI, когда что-то не так. Я думаю, что лучше всего это сделать в событии afterSubmitCell, но проблема в том, что я не могу помешать jqGrid отображать диалог по умолчанию с ответным сообщением сервера.

У меня что-то вроде этого:

        $('#productslist').jqGrid('setGridParam', {
        afterSubmitCell : function(serverresponse, rowid, cellname, value, iRow, iCol){
            $('<div></div>').html('My own error message').dialog({ 
                'title' : 'Some title',
                'modal' : true,
                'show' : 'blind',
                'hide' : 'blind'
            });

            return [false, ''];
        }
    }).trigger('reloadGrid');

Согласно документации: http://www.trirand.com/jqgridwiki/doku.php?id=wiki:cell_editing

Это событие должно возвращать массив с логическим значением, указывающим, является ли он успешным или нет, и в качестве второго сообщения. Это сообщение будет отображаться в диалоговом окне jquery-ui, запущенном самой jqGrid.

Дело в том, что я хочу настроить диалог, когда что-то не так происходит. Но, похоже, возможностей для этого немного, или я не могу их найти.

Я также попробовал событие errorCell, но это событие вызывается только тогда, когда сервер не выдает ответ 200. Или я должен отправить другой код ответа как 200, когда ошибка происходит? Кажется, немного грязно для меня ..

Надеюсь, кто-нибудь может мне помочь! Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 05 апреля 2012

Я нашел способ подавить встроенное диалоговое окно без необходимости изменять исходный код, что, очевидно, является последним средством по причинам обслуживания. Когда всплывает встроенное диалоговое окно, оно получает фокус, что позволяет нам использовать это событие, чтобы снова закрыть его

//Supresss jqGrid error dialog, called #info_dialog
$(document).on("focus", "#info_dialog", function () {

    $("#info_dialog").hide();

});

Или, если, как и у меня, единственная проблема заключалась в стилизации, и вы с удовольствием передаёте сообщение jqGrid напрямую в свой диалог, вы можете сделать следующее и ничего не вставлять:

//Supresss jqGrid error dialog, called #info_dialog
$(document).on("focus", "#info_dialog", function () {

    var errorMessage = $("#infocnt").text();
    $("#info_dialog").hide();
    var $dialog = $('<div></div>')
        .html(errorMessage)
        .dialog({
            autoOpen: true,
            resizable: false,
            buttons: { "Done": function () { $(this).dialog("close"); } },
            title: 'Error'
        });

    $dialog.dialog('open');

});
2 голосов
/ 20 декабря 2013

Я знаю, что это старый пост, но, вероятно, лучший способ справиться с этим, без вторжения в код, это переопределить функцию в вашем собственном коде:

jQuery.jgrid.info_dialog = function(arguments)
{
     // implement your own notification
     showMessage("error");
};
1 голос
/ 30 августа 2011

На мой взгляд, рекомендуется использовать всегда и ошибку HTTP-код (код> = 400) в случае любой ошибки .В этом случае вы можете использовать errorCell событие.

Если вы не можете изменить код сервера, вы можете изменить код jqGrid и изменить строки

} else {
    $.jgrid.info_dialog($.jgrid.errors.errcap,ret[1],$.jgrid.edit.bClose);
    $($t).jqGrid("restoreCell",iRow,iCol);
}

на следующее

} else {
    if ($.isFunction($t.p.errorCell)) {
        $t.p.errorCell.call($t, result, stat);
    } else if (ret[1]) {
        $.jgrid.info_dialog($.jgrid.errors.errcap,ret[1],$.jgrid.edit.bClose);
    }
    $($t).jqGrid("restoreCell",iRow,iCol);
}

Вы можете сделать такие изменения в jquery.jqGrid.src.js (перейти к строке 8665 в версии 4.1.2).

0 голосов
/ 27 марта 2014

вы можете сделать что-то вроде этого

$("#info_dialog").visible(false);

return [false, ""];

Теперь сообщение по умолчанию не будет отображаться.Вы можете открыть все, что вы хотите, с помощью собственного кода.

...