jqGrid содержит столбцы с именем сотрудника и идентификатором сотрудника.
Если employee name
изменилось, для проверки имени должен быть вызван метод проверки сервера.Текущие столбцы строк должны обновляться на основе данных, возвращаемых этим методом.
Если employee id
изменилось, должен быть вызван метод проверки сервера для проверки идентификатора.Текущие столбцы строк должны обновляться на основе данных, возвращаемых этим методом.
Желательно, чтобы jqGrid оставался в режиме редактирования, чтобы у пользователя была возможность продолжать изменять, принимать или отклонять изменения.
Как реализовать этов линейном и редактировании формы?Я думаю о следующих возможностях:
Возможность 1.
Использование editrules с пользовательским валидатором, таким как
editrules = new
{
custom = true,
custom_func = function(value, colname) { ??? }
},
Проблемы: Как получить данные из всех столбцов, выполнить синхронизациюили асинхронный вызов и обновление столбцов с результатами этого вызова.
Возможность 2.
Требуется, чтобы пользователь нажал клавишу Enter, чтобы сохранить строку.Проблемы: как найти, какой столбец был изменен и передать этот номер столбца на сервер.Как обновить данные текущей строки из ответа сервера.
Возможность 3.
с использованием размытия, как описано в великолепном ответе Олега в jqgrid, изменить значение ячейки и остаться в режиме редактирования
Проблемы: размытие не срабатывает, если данные вводятся и ввод нажимается немедленно.Как применить размытие в этом случае?
В общем случае вычисление / проверка sice сервера должно быть выполнено следующим образом:
Если столбец изменен, а фокус перемещен или нажата кнопка ввода в измененном столбце для сохранения, на стороне сервера синхронизации или, если это невозможно, должен быть вызван асинхронный метод.Измененное имя столбца и текущие значения редактируемой строки, как в методе редактирования, передаются в качестве параметров этому методу.
Этот метод возвращает новые значения для редактируемой строки.текущие отредактированные значения строки должны быть заменены значениями, возвращаемыми этим методом.
Обновление
Ответ Олег предполагает, что первичный ключ изменен.Этот фактор не важен.Вот новая версия вопроса без первичных ключей и других обновлений:
jqGrid содержит столбцы со штрих-кодом продукта и именем продукта.
Если product name
изменилось, для проверки имени должен быть вызван метод проверки сервера.Текущие столбцы строки должны обновляться на основе данных, возвращаемых этим методом.
Если product barcode
изменилось, должен быть вызван метод проверки сервера для проверки штрих-кода продукта.Текущие столбцы строк должны обновляться на основе данных, возвращаемых этим методом.
jqGrid должен оставаться в режиме редактирования, чтобы у пользователя была возможность продолжать изменять, принимать или отклонять изменения.
Как реализовать это ввстроенное редактирование и редактирование форм?Я думаю о следующих возможностях:
Возможность 1.
Использование editrules с пользовательским валидатором, таким как
editrules = new
{
custom = true,
custom_func = function(value, colname) { ??? }
},
Проблема: custom_func не срабатывает, если элемент ввода теряет фокус.Вызывается перед сохранением для всех элементов.Поэтому его нельзя использовать.
Возможность 2.
Требуется, чтобы пользователь нажал клавишу Enter, чтобы сохранить строку.Проблемы: как найти, какой столбец был изменен и передать этот номер столбца на сервер.Метод сохранения должен содержать известный столбец (имя или порядок изменения штрих-кода) и заполнять различные столбцы.Это выглядит неоправданно.
Возможность 3.
с использованием размытия:
colModel: [{"label":"ProductCode","name":"ProductCode","editoptions":{
"dataEvents":[
{"type":"focus","fn":function(e) { ischanged=false}},
{"type":"change","fn":function(e) {ischanged=true}},
{"type":"keydown","fn":function(e) {ischanged=true }},
{"type":"blur","fn":function(e) { if(ischanged) validate(e)} }
]},
Для реализации проверки я нашел код от Олега великого ответа в jqgrid изменить значение ячейкии оставайтесь в режиме редактирования
Сводная информация о требованиях:
Если столбец изменен, а фокус перемещен или введен ввод в измененном столбце для сохранения, синхронизации на стороне сервера или, если это невозможно,асинхронный метод должен быть вызван.Измененное имя столбца и текущие значения отредактированной строки, как в методе редактирования, передаются в качестве параметров этому методу.
Этот метод возвращает новые значения для отредактированной строки.текущие отредактированные значения строк должны быть заменены значениями, возвращаемыми этим методом.
Update2
Этот вопрос не о параллелизме. Это проблема одного пользователя и jqGrid. Обновление означает, что один пользователь меняет название продукта или штрих-код, а сервер должен предоставлять дополнительные данные (идентификатор продукта и / или имя / штрих-код) в ответ на это.
Обновление 4
Я попробовал код ниже.
Если пользователь вводит новый код и нажимает клавишу Enter, не переходя в другую строку, размытие не происходит и проверка не вызывается.
Как отключить метод сохранения jqGrid, если ячейка грязная, или другая идея, как заставить этот код работать, если нажата клавиша enter, чтобы завершить редактирование, не теряя фокус из измененной ячейки внешнего ключа?
function validate(elem, column) {
ischanged = false;
var i, form, row;
var postData = { _column: column };
var colModel = $("#grid").jqGrid('getGridParam', 'colModel');
var formEdit = $(elem).is('.FormElement');
// todo: use jQuery serialize() ???
if (formEdit) {
form = $(elem).closest('form.FormGrid');
postData._rowid = $("#grid").jqGrid('getGridParam', 'selrow');
for (i = 0; i < colModel.length; i++)
eval('postData.' + colModel[i].name + '="' + $('#' + colModel[i].name + '.FormElement', form[0]).val() + '";');
}
else {
row = $(elem).closest('tr.jqgrow');
postData._rowid = row.attr('id');
for (i = 1; i < colModel.length; i++)
eval('postData.' + colModel[i].name + '="' + $('#' + postData._rowid + '_' + colModel[i].name).val() + '";');
}
$.ajax('Grid/Validate', {
data: postData,
async: false,
type: 'POST',
success: function (data, textStatus, jqXHR) {
for (i = 0; i < data.length; i++) {
if (formEdit)
$('#' + data[i].name + '.FormElement', form[0]).val(data[i].value);
else
$('#' + postData._rowid + '_' + data[i].name).val(data[i].value);
}
}
});
}
colModel определяется как:
{"name":"ProductBarCode",
"editoptions": {"dataEvents":
[{"type":"focus","fn":function(e) {ischanged=false}
},
{"type":"change","fn":function(e) {ischanged=true},
{"type":"keydown","fn":function(e) {if(realchangekey()) ischanged=true}
},{"type":"blur","fn":function(e) { if(ischanged) { validate( e.target,ProductBarCode')}}
}]},"editable":true}