Я уже несколько дней работаю, на первый взгляд, над простой задачей - реализовать собственную ячейку. Задача следующая: создать пользовательскую ячейку с элементом div с идентификатором (например, "mydiv"
), затем вызвать функцию для этого div, например $('#mydiv').raty({start: cellvaue, readonly:true})
, а затем 3-ю подзадачу - в режиме редактирования (editGridRow
) Я должен изменить параметр raty-function на readonly:false
, так как должно быть возможно изменить значение.
Во-первых, я работал с форматером. В форматере я определил свой элемент div, а с вызовом afterInsertRow моя функция $ ('# mydiv'). Raty ({start: cellvalue, readonly: true}). Для обзора это работало отлично. Но в модальном диалоге редактирования editGridRow
всегда вводился текст ввода формы, который мне здесь не нужен. Мне нужен здесь только мой элемент div. Если я правильно понимаю, средство форматирования только изменяет значения, но по-прежнему отображает входной текст формы.
Затем я переключился на edittype: custom
, но это не помогло, потому что эти функции вызываются впервые только в editGridRow.
Я уверен, что эта проблема разрешима, вопрос только в том, как.
Спасибо за любые советы.
UPDATE
Благодаря Олегу я сейчас очень близок к оперативной реализации этой задачи. Здесь я опишу свое решение (основываясь на советах Олега или, по крайней мере, на моей интерпретации его советов).
JqGrid определяется с помощью datatype: "json"
.
Пользовательская ячейка определяется как:
name:'ranking', editable:true, edittype:'custom',formatter:ratingFormatter,
editoptions:{custom_element:ratingFormatter, custom_value:ratingValue}
Указанные функции определены следующим образом:
function ratingFormatter(cellvalue, options, rowObject) {return '<div class="rnk"></div>';};
function ratingValue(elem, operation, value) {return $('#ranking-score').val();};
Затем модальное диалоговое окно редактирования:
ondblClickRow: function(id) {
jQuery('#grid').jqGrid('editGridRow',id,
{closeOnEscape:true,width:400,
savekey:[true,13],
recreateForm:true,beforeShowForm:initRating
});
Функция initRating:
function initRating() {$('#ranking').raty({path:'/img/'})};
И, наконец, событие loadComplete
loadComplete: function (data) {
var ids = jQuery("#grid").getDataIDs();
for(var i=0;i<ids.length;i++){
var rowid = ids[i];
var ranking = data.rows[i].cell[6];
$('#' + rowid +'> td > div.rnk').raty({path:'/img/',start:ranking,readOnly:true});
$('#' + rowid).contextMenu('MenuJqGrid', eventsMenu);
}
}
Так много шагов для такой маленькой вещи, как плагин рейтинга. Невероятно.
Последняя нерешенная проблема - получение текущей оценки в функцию initRating. Это означает, что если я перейду к editGridRow, у меня еще не определен рейтинг. Хммм.