2016-03-07 2 views
3

Я использую бесплатный jqgrid 4.13.0бесплатно jqgrid пользовательские форматировщик потеряли после сортировки или фильтрации

Я написал пользовательский форматировщик, но, к сожалению, мои ячейки содержимое этого столбца всегда теряются после сортировки таблицы или фильтрации. Я, вероятно, что-то неправильно делаю в функции форматирования, но на самом деле не понял, чего не хватает. Кто-нибудь может заметить мою ошибку? Почему он отлично работает со встроенными, но не с моими. Я был вдохновлен этим: http://www.ok-soft-gmbh.com/jqGrid/CascadingFormater.htm

Я вижу, как пример вызывает $.fn.fmatter.call, и, возможно, мне тоже нужно это сделать. Это ключ? К сожалению, я не могу найти документацию о том, как это сделать, если я сам напишу эту функцию.

Это моя установка:

var formatEnduser = function (cellValue, options, rowObject, action){ 
    return rowObject.so_enduser_id == undefined ? '' : '<a href="index.php?module=Accounts&view=Detail&record='+rowObject.so_enduser_id+'">'+rowObject.so_enduser_name+'</a>'; 
} 

$("#jqGrid").jqGrid({ 
    datatype: "jsonstring", 
    datastr: jsonData, 
    jsonReader: { 
     root: 'rows', 
     id: 'crmentity_id', 
     repeatitems: false, 
     page: function(obj) { return 1; }, 
     total: function(obj) { return 1; }, 
     records: function(obj) { return obj.rows.length; }, 
    }, 
    autowidth: true, 
    height: 600, 
    shrinkToFit: true, 
    rownumbers: true, 
    rowNum: 5, 
    pager: false, 
    loadonce: true, 
    viewrecords: true, 
    colModel: [ 
     { 
      name: 'crmentity_id', 
      key: true, 
      hidden: true 
     }, 
     { 
      label: 'Enduser', 
      name: 'so_enduser_name', 
      searchoptions: { 
       sopt : ['cn'] 
      }, 
      formatter: formatEnduser 
     }, 
    ] 
}); 
$('#jqGrid').jqGrid('filterToolbar'); 

Объект jsonData выглядит следующим образом:

Object { rows=[623], so_total_total=4321, in_total_total=1234 } 

В собственности rows можно найти следующее:

[Object { crmentity_id="60199", so_enduser_id="6808", so_enduser_name="enduser123", mehr...}, Object { crmentity_id="60136", so_enduser_id="6362", so_enduser_name="userend321", mehr...}, 620 mehr...] 

Спасибо большое за любая помощь!

EDIT: я добавил jsfiddle, чтобы продемонстрировать проблему, найти конец в фильтре и посмотреть, как данные исчезают. Сортировка делает то же самое. http://jsfiddle.net/tztj9yn7/2/

ответ

2

Основная проблема заключается в том, что ваш код является следующим. Вы используете datatype: "jsonstring", а пользовательский форматировщик использует свойство входных данных so_enduser_id, но свойство не является столбцом сетки. Тип данных "jsonstring" будет обрабатываться таким же образом, как тип данных "json" (или «jsonp» или "xml"). Он будет прочитан jqGrid и сохранен локально только столбцами от colModel и jsonReader.id дополнительно. Таким образом, свойство so_enduser_id входных данных будет доступно в rowObjectтолько при начальном чтении сетки. Все, что я написал до сих пор, одинаково для старого jqGrid и для бесплатного jqGrid.

В случае использования старый jqGrid есть два альтернативных способа решения проблемы:

  • добавить скрытый столбец с name: "so_enduser_id"
  • заменить datatype: "jsonstring", datastr: jsonData на datatype: "local", data: jsonData.rows и заменить jsonReader к localReader: { id: 'crmentity_id' }. Входные данные будут сохранены со всеми свойствами (например, на входе) в случае использования datatype: "local", и проблема будет устранена.

Если вам нужно будет загрузить данные непосредственно из URL затем второго пути (datatype: "local") будет невозможно, и единственным способом будет использованием скрытых столбцов для всех свойств, которые нужны позже.

Бесплатно jqGrid предоставляет вам еще один очень простой способ: использование опции additionalProperties. Идея additionalProperties очень проста. Нужно иногда сэкономить дополнительные свойства из каждого элемента входных данных, чтобы использовать его локально позже (из-за использования loadonce: true).Сохранение данных в DOM намного дороже, чем сохранение данных в структурах JavaScript. Можно просто использовать опцию, например additionalProperties: ["crmentity_id", "so_enduser_id"], чтобы сообщить бесплатную jqGrid, чтобы прочитать некоторые другие свойства и сохранить там локально. В результате ваш код будет исправлен немедленно: см. http://jsfiddle.net/tztj9yn7/3/

Еще одна важная рекомендация об использовании пользовательских форматировщиков в бесплатном jqGrid. Существуют некоторые важные проблемы с параметром rowObject. Это всего лишь входной элемент точно так же, как в источнике. Таким образом, если вы использовали бы, например, datatype: "xml", то параметр rowObject был бы узлом XML. Точно так же, если вы будете использовать repeatitems: true формат (["60199", "6808", "enduser123"] вместо {crmentity_id:"60199", so_enduser_id:"6808", so_enduser_name:"enduser123"}), то вам придется использовать rowObject[1] вместо rowObject.so_enduser_id, чтобы получить доступ к свойству so_enduser_id из начальных входных данных. При следующей сортировке или фильтрации у вас будет другой формат из rowObject (rowObject.so_enduser_id) из-за входных данных будут данные из местного параметра data. Бесплатный jqGrid по-прежнему использует тот же формат параметра rowObject, чтобы обеспечить лучшую совместимость со старыми версиями jqGrid, но он установил дополнительноrowData свойство параметра options. У options.rowData есть всегда детерминированный именованный формат данных, и всегда можно использовать options.rowData.so_enduser_id независимо от формата входных данных и используемого datatype. Таким образом, options.rowData является предпочтительным способом доступа к входным данным. Нельзя использовать третий параметр. Полученный код форматере будет

var formatEnduser = function (cellValue, options) { 
     var item = options.rowData; 

     return item.so_enduser_id == undefined ? 
       '' : 
       '<a href="index.php?module=Accounts&view=Detail&record=' + 
        item.so_enduser_id + '">' + item.so_enduser_name + '</a>'; 
}; 

См http://jsfiddle.net/tztj9yn7/4/

+0

Спасибо большое за решение проблемы и даже больше для подробного объяснения! Бесплатный jqGrid - это потрясающий народ, но это возможно только из-за таких удивительных людей, как вы, заботясь об этом! – Preexo

+0

* «Удивительный проект, но это возможно только из-за удивительных людей ...». – Preexo

+0

@Preexo: Добро пожаловать! – Oleg

Смежные вопросы