Сортировка по отображаемому значению в ExtJS 3 EditorGridPanel - PullRequest
4 голосов
/ 19 марта 2012

Я новичок в Ext, поэтому заранее прошу прощения, если мой вопрос недостаточно ясен / слишком прост ...

У меня есть Ext.grid.EditorGridPanel с Ext.data.Store и Ext.data.JsonReader.

У меня следующая проблема:

Я хотел бы сделать столбцы в моей сетке сортируемыми, но значение, возвращаемое из моего хранилища, не является значением, которое я хотел бы отсортировать (возвращаемое значение является идентификатором, и я хотел бы отсортировать по строке this ID сопоставляется с).

У меня есть функция рендеринга, которая преобразует этот идентификатор в строковое значение, но я не знаю, как интегрировать это в мой код.

Я нашел это сообщение:

http://www.sencha.com/forum/showthread.php?45324-Grid-column-sorting-on-rendered-value

, которая выглядела как моя потребность, но когда я попытался добавить:

{name: 'my_field', sortType: my_render_function}

моему JsonReader это не сработало.

Где я могу ошибиться?

Спасибо.


По запросу Патера:

var my_render = function(val, metaData, record, rowIndex, colIndex, store){
   if (val == null) 
       return '';
   var n = another_store.getById(val);
   if (n == null) 
       return '';
   return n.data.name;
};

var my_reader = new Ext.data.JsonReader({
   root: 'my_root',
   id: 'tissue_num',
   }, [{
   name: 'tissue_num',
   type: 'int'
   }, 'tissue_desc', 'organ']
);

var my_store = new Ext.data.Store({
url: request_url,
baseParams: {
    _state: request_state,
    _action: 'get_conditions'
},
sortInfo: {
    field: 'tissue_num',
    direction: "ASC"
},
reader: my_reader,
pruneModifiedRecords: true
});

1 Ответ

3 голосов
/ 20 марта 2012

Поскольку вам нужно нечто большее, чем просто отображение преобразования, я бы не использовал здесь средство визуализации, а вместо этого convert данные в определении записи.

val convertName = function(val, rec) {
   // val will always be null since there's no field named 'name'
   var id = rec.data.tissue_num;
   if (id == null) 
       return '';
   var n = another_store.getById(id);
   if (n == null) 
       return '';
   return n.data.name;
};

var my_reader = new Ext.data.JsonReader({
   root: 'my_root',
   id: 'tissue_num',
   }, [{
   name: 'tissue_num',
   type: 'int'
   }, {name: 'name', convert: convertName},
   'tissue_desc', 'organ']
);

Это даст вам запись с данными в поле name, что вы можете делать все, что будете делать с фактическими данными, полученными с сервера & mdash; сортировка, фильтрация, отображение и т. д. Проще, чем пытаться отыскивать отображаемое значение каждый раз, когда оно вам нужно.

...