Вы отправили только небольшую часть своего кода, но внутри можно увидеть много проблем.
Первый: вы должны быть осторожны в типе используемых свойств. Например, значение width
свойство colModel
элементов должно быть числом вместо строки ("width" : 100
вместо "width" : "100"
). Более важно то, что значение formatter
должно быть функцией вместо строки, которая содержит имя функции. JavaScript анализирует код JavaScript и видит все переменные, определенные в той же области (например, вы можете определить функцию colorformatter
непосредственно внутри функции jqGridMethod
) или во внешней области. Если вы получите colModel
с сервера с помощью вызова Ajax, вы не можете напрямую указать функцию, потому что JSON не поддерживает тип fuction. В этом случае вы должны использовать jqGrid версии 4.7 или выше (рекомендую использовать free jqGrid 4.9.2). Он позволяет вам определять общие шаблоны, которые используют пользовательский форматтер, и использовать строку в качестве значения formatter
. См. here. В качестве альтернативы вы можете определить пользовательские форматирования, установив colorformatter
свойство объекта $.fn.fmatter
. См. the code или another one, который определяет formatter: "dynamicLink"
и formatter: "checkboxFontAwesome4"
.
Вторая важная проблема заключается в понимании цели форматирования. Проблема заключается в следующем. jqGrid необходимо заполнить контент (тело) сетки. Веб-браузер предоставляет интерфейс для динамического управления содержимым страницы HTML, но очень важно понять, что изменение одного элемента на странице сопровождается изменением других элементов. Например, если вы вставляете строку в таблицу, то положение строк ниже и положение других элементов ниже таблицы можно изменить. Точно так же может быть изменен стиль CSS и другие элементы. Поэтому веб-браузер должен пересчитать многие свойства всех существующих элементов страницы после любой модификации HTML-страницы. Процесс имеет название reflow (см. here). Для повышения производительности заполнения большой сетки jqGrid используйте следующий сценарий. Он собирает содержимое всего тела сетки в виде фрагментов HTML-строк, а затем размещает innerHTML
свойство <tbody>
элемент сетки как одна операция. Это значительно улучшает производительность заполнения большой сетки. Теперь должно быть ясно, что formatter должен вернуть фрагмент HTML ячейки как строку. Точно так же вы не можете использовать myGrid.jqGrid ('getCell', selRowId, 'Color')
, чтобы получить значение из тела сетки, потому что пользовательский форматтер будет называться до тело будет заполнено.
Если пользовательский форматтер должен получить доступ к значению из другого столбца той же строки, то он должен использовать параметры options
или rowObject
. В случае использования free jqGrid вы можете удалить параметр rowObject
, потому что вся необходимая информация находится в options
. Ряд текущей строки заполнения находится в options.rowId
. Значения от входных данных для текущей строки можно найти в options.rowData
. Чтобы получить значение от Color
, вы можете использовать options.rowData.Color
.
Если вам нужно использовать старые версии jqGrid, вы должны использовать параметр rowObject
. Формат данных объекта rowObject
зависит от многих факторов. Во время начального заполнения сетки объект rowObject
содержит данные в том же формате, что и входные данные, возвращаемые с сервера. Если вы загружаете данные с сервера в формате
{
"total": "xxx",
"page": "yyy",
"records": "zzz",
"rows": [
{"id":"12", "cell":["cell11", "cell12", "cell13"]},
{"id":"34", "cell":["cell21", "cell22", "cell23"]},
...
]
}
, то вы должны использовать rowObject[i]
для доступа Color
колонки, и вы должны использовать i
, соответствующий номер Color
столбца в colModel
массиве. options.pos
может быть индексом, который вы должны использовать вместо i
, но значение может различаться с 1 по 3, зависит от того, используете ли вы или нет опции multiselect: true
, subGrid: true
или rownumbers: true
.
Если вы используете другой формат входных данных
{
"total": "xxx",
"page": "yyy",
"records": "zzz",
"rows": [
{"id":"12", "colName1":"cell11", "Color":"cell12", ...},
{"id":"34", "colName1":"cell21", "Color":"cell22", ...},
...
]
}
тогда rowObject.Color
поможет вам необходимые данные.
В случае использования первого (массива) формата входных данных и с использованием loadonce: true
дополнительно у вас будет более сложная ситуация. Во время начальной загрузки данных вам нужно будет использовать rowObject[2]
для доступа Color
, но при последующем заполнении сетки формат rowObject
будет изменен, и вместо этого вам придется использовать rowObject.Color
. Поэтому вам нужно будет проверить, является ли массив rowObject
или нет, и использовать соответствующий формат. Использование rowObject.Color || rowObject[2]
может иметь хорошие результаты.
Я подробно описал формат rowObject
, чтобы вы поняли, как использовать бесплатный jqGrid 4.9.2, который упрощает код. Вы можете просто использовать options.rowData.Color
для доступа к Color
независимо от формата входных данных и независимо от использования опции loadonce: true
.
ok.i Я использую java spring mvc для backend.Is эта функция правильная? { \t \t \t "Название": "ColorCode", \t \t \t "Индекс": "ColorCode", \t \t \t "ширина": 100, \t \t \t форматировщик: colorformatter \t \t \t \t \t} – Miller
@ VishnuM: Это намного лучше, но я бы порекомендовал вам ** никогда ** установить свойство 'index' вообще.Кроме того, важно **, где ** в вашем коде вы определяете функцию colorformatter. Я сам не использую java spring. Кроме того, вы публикуете ** короткие фрагменты кода JavaScript, но проблема может возникнуть, если вы поместили фрагмент кода в неправильное место. Вы вносите изменения в свой код? Вызывается ли 'alert' из' colorformatter'? Как выглядит код 'colorformatter'? Какую версию jqGrid вы используете? Где более полный код JavaScript, который вы используете? У вас есть ошибка? – Oleg
Я обновил свой код и опубликовал полную часть. Но он все еще не работает. – Miller