Как использовать фокусировку на текстовое поле в модальной форме из jqGrid custom_func? - PullRequest
0 голосов
/ 05 августа 2011

В colModel у меня есть один custom_func: myFunc(), который проверяет, не введено ли целое значение, введенное в текстовое поле модальной формы Add или Edit jqGrid, в нескольких строках, видимых в сетке, где loadonce:true установить в настройках. То, как это custom_func: не выполняется, пока не будет нажата кнопка отправки модальной формы, но я хотел бы проверить текстовое поле модальной формы, когда оно находится в фокусе (или размытие?). Есть ли способ сделать это? Я попытался сделать это, как показано ниже в опции afterShowForm:, и это вроде работает, но сообщение об ошибке и остановка не то же самое, что при нажатии кнопки Отправить, есть ли способ сделать фокусировку / размытие от custom_func: myFunc() * * 1006

Ниже приведен фрагмент colModel, за которым следует пользовательская функция, а затем попытка использовать focusout в afterFormShow: function() модальной формы Add.

//colModel
...},
{name: 'ezyid', index: 'ezyid', width: 60, align: "center", editable: true,
        formoptions: { rowpos: 1,
            colpos: 1,
            label: "Ezy ID",
            elmprefix: "(*) " 
            },
editrules: {
            custom: true,
            custom_func: chkDuplicateEzyids, //custom function
            required: true
            }
        },             

Пользовательская функция colModel:

function chkDuplicateEzyids(value, colname) {

var isFound = false;

var rows = grid.jqGrid('getRowData');

for (var i = 0; i < rows.length; i++) {

    var row = rows[i];

    if (value == row.ezyid && value != '') { isFound = true };

}

if(isFound){

    return [false, "This Ezy ID is in use, please enter another or press Cancel."];

} else {

    return [true, ""];

}

}

Моя менее чем идеальная попытка использовать пользовательскую функцию, доступную из опции afterShowForm: опций Добавить модальные формы (было бы аналогичным использованием в Edit, если бы это было сделано таким образом):

addSettings = {
recreateForm: true,
jqModal: false,
reloadAfterSubmit: false,
closeOnEscape: true,
closeAfterAdd: true,
afterShowForm: function ($form) {
    var form = $form.parent()[0];

    $("#ezyid", form).blur(function () { //or focusout() if better

        var resp = chkDuplicateEzyids($(this).val(), 'Ezy ID');

        if (!resp[0]) {
            $("#FormError", form).show();
            $(".ui-state-error", form).html(resp[1]);
        }
    });

    $("#lui_" + grid[0].id).hide();
},
onclickSubmit: onclickSubmitLocal
},

Подводя итог, я хотел бы использовать focusout (или blur) для немедленной проверки значения текстового поля, вместо того, чтобы вводить все остальные значения формы, чтобы перейти к кнопке Submit только для того, чтобы найти значение, которое уже находится в использовать. Это кажется обычной практикой, но я не могу понять это в этом контексте. Много ТИА.

(некоторые фрагменты кода используются повторно с одобрением и благодарностью пользователя stackoverflow @Oleg)

1 Ответ

1 голос
/ 05 августа 2011

Я бы порекомендовал вам использовать dataEvents , чтобы связать любой обработчик событий (например, focusout , который немного лучше, чем blur) с соответствующим элементом управления вводом.См. старый ответ для примера.

Еще одно замечание.Столбец 'ezyid', кажется, имеет уникальные значения.Так что вы можете использовать key: true в столбце.В случае, если для значений из столбца будут использоваться идентификаторы для строк сетки (для <tr> элементов <table>).В этом случае функция chkDuplicateEzyids может быть уменьшена до if ($('#' + value).length > 0) {/*duplicate are found*/} или до if ($('#' + $.jgrid.jqID(value)).length > 0) {/*duplicate are found*/}, если вы хотите использовать метасимволы в идентификаторе.Единственное, что вам нужно, это реализовать скрытие столбца 'ezyid' в диалоге редактирования (подробности см. здесь ) и показывать его только в форме «Добавить».

...