jqGrid - несоответствия rowObject? - PullRequest
8 голосов
/ 20 декабря 2010

Первая страница результатов с jqgrid rowObject возвращает ожидаемые данные, но затем возвращает неполные данные для последующих страниц результатов.Почему?

Первая страница результатов: rowObject [3] будет равняться "2"

Последующие страницы результатов: rowObject [3] будет равняться "undefined" и возвращаться к первойстраница результатов теперь также будет иметь значение «undefined».

Дополнительные сведения и код:

С jqGrid, если вы хотите реализовать пользовательский форматировщик, вы используете параметрназывается rowObject, который содержит данные строки.Так, например, одна строка rowObject может выглядеть примерно так:

["18", "133", "Betelguese", "3", "photo.jpg", "", "0", ""]

Так что мой пользовательский форматировщик использует некоторые из этих данных для подготовки ссылки следующим образом:

var newval = '<a href="/proj/' + rowObject[3] + '/images/' + imgval + '">' + imgval + '</a>';

, и это даетмне URL вроде:

<a href="/proj/3/images/photo.jpg">photo.jpg</a>

Пока все хорошо.Моя проблема заключается в том, что при переходе на следующую страницу результатов в jqgrid я теряю некоторые из этих данных и получаю:

<a href="/proj/undefined/images/photo.jpg">photo.jpg</a>

Если я загружаю страницу со всеми отображаемыми результатами, все работает нормально, однакоесли я использую разбиение на страницы, только первая страница результатов будет иметь правильное значение для rowObject [3], в то время как все остальные результаты на последующих страницах не будут иметь это значение rowObject!

Так почему rowObject содержит правильные данные начто изначально загружается в сетку и, похоже, теряет эти данные при появлении следующей страницы результатов сетки?

Одна вещь, которую я вижу в Firebug, я не понимаю ... при начальной загрузке страницыЯ получаю:

console.log(rowObject); 
["18", "133", "Betelguese", "3", "photo.jpg", "", "0", ""]

На следующей странице результатов, где все перестает работать, как я ожидаю, я вижу

console.log(rowObject);
Object { photo_id="18", site_id="133", more...} 

Почему произошли изменения?Первый результат - json, так почему я сейчас получаю этот объект?

1 Ответ

11 голосов
/ 20 декабря 2010

Я полагаю, вы используете loadonce:true вариант. Это один из вариантов, которые приносят много проблем (в основном понимание проблем). Разделение между локальными и удаленными данными было ясным до введения в версии 3.7 jqGrid новых функций локальной сортировки, разбиения на страницы и фильтрации (поиска). Начиная с версии 3.7 jqGrid, опция loadonce:true позволяет вам смешивать удаленные данные, которые вы получаете при первой загрузке, и локальные данные, которые вы получаете позже. В другом ответе близкая проблема уже обсуждалась. В конце процесса загрузки в случае использования опции loadonce:true datatype jqGrid будет изменено на 'local'. После этого многие вещи работают по-другому.

Я предлагаю вам использовать jQuery.isArray (rowObject) как быстрый и эффективный способ определить, следует ли вам обращаться к rowObject для целочисленного индекса rowObject[3] (если вы обращаетесь к удаленным данным) или к именованное свойство rowObject.projectId.

Вы можете увидеть все локальные данные с помощью $("#list").jqGrid('getGridParam','data'), который возвращает массив всех локальных rowObject.

Если данные, к которым вам необходимо получить доступ (rowObject[3]) , не сохранены в jqGrid в каком-либо столбце, вы не сможете увидеть информацию в rowObject. В этом случае вы можете использовать дополнительный скрытый столбец для данных или сохранить данные при первой загрузке внутри loadComplete: function(data) { ... } в любом внешнем объекте . Вы можете проверить, что $("#list").jqGrid('getGridParam','datatype') равно 'json' (или 'xml' зависит от данных вашего сервера), и если оно истинно, вы можете сохранить все данные, полученные с нужного вам сервера (из 3-го столбца * 1031). * массив) во внешнем массиве объекта. Таким образом, вы сможете получить доступ к данным позже в своем пользовательском форматере.

ОБНОВЛЕНО : проблема решена в бесплатной jqGrid форке jqGrid. Пользовательский модуль форматирования (и cellattr, rowattr) по-прежнему содержит параметр rowObject для совместимости, но существуют дополнительные rowData свойства, в которых проанализированные данные сохраняются как именованные свойства:

formatter: function (cellValue, options, rowObject) {
    // either rowObject[1] or rowObject.site_id,
    // but options.rowData.site_id works ALWAYS
}

Можно использовать

cellattr: function (rowid, cellValue, rowObject, cm, item) {
    // either rowObject[1] or rowObject.site_id,
    // but item.site_id works ALWAYS
}

in cellattr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...