2015-08-27 4 views
2

Столбец управления сеткой заказывается на основе name, который является комбинированным полем first + ' ' + last. Клиент хочет заказать по last + ', ' + first. Мне не разрешено изменять существующий код, он может использовать только переопределения.ExtJS 5.0 - переопределение для обеспечения пользовательского заказа на столбец сетки

Основываясь на результатах поиска в сети, я думаю, что использование sortType для преобразования входного значения является наименее навязчивым. Но я не уверен, как подключить его.

Я думаю, sortType работает с полями данных, поэтому в перегрузке initComponent я могу получить доступ к тому, что мне нужно? Например, это, как я переопределить в окне, чтобы изменить визуализацию:

initComponent: function() { 
    this.callParent([]); 
    this.columns[0].renderer = 
     function(value, metaData, record, rowIdx, colIdx, store, view) { 
      var result = ''; 
      if (!Ext.isEmpty(record.data) && !Ext.isEmpty(record.data.details)) { 
       var details = record.data.details; 
       // value == details.name is 'first last', won't be using that 
       result = details.last + ', ' + details.first; 
      } 
      return result; 
     }; 
} 

Могу ли я получить доступ к details.name определению отсюда переопределить sortType? Согласитесь, что это не лучший подход, потому что мне нужно будет провести синтаксический разбор name, чтобы разделить его, а затем снова соединить. И это будет иметь проблемы для тех, у кого есть несколько первых и/или фамилий.

Альтернативный подход к перегрузке doSort, но если у меня нет доступа к details.first и details.last, он не будет лучше, чем sortType. Я видел один пример реализации doSort, и он выглядит очень сложным. Кто-нибудь знает подробную документацию для doSort?

ответ

1

Проблема заключается в том, что sortType не принимает всю запись, и она применяется непосредственно к columns[0].dataIndex, без какой-либо возможности вмешиваться. И вы можете использовать только манипуляции со строками, если вы знаете, где первое имя заканчивается и фамилия начинается:

this.columns[0].sortType = function(value) { 
    var spl = value.split(' '); 
    return value[1] + ', ' + value[0]; 
} 

Конечно, это будет столкнуться с проблемами, с такими именами, как «Карл Фридрих Теодор Вильгельм Фрайхерр фон унд цу Гуттенберг» и например, даже «Джордж У. Буш» будет проблемой.

Лучший способ это ввести еще одно поле в модель, то вдоль линий

MyApp.model.Resource.getFields().push(Ext.create('Ext.data.Field',{ 
    name:"LastFirst", 
    convert:function(v,rec) { 
     return rec.get("last")+', '+rec.get("first") 
    } 
})); 

Это изменение не влияет на существующие модели экземпляров, так что вы должны сделать это перед созданием любого экземпляра модели ,

Это позволит вам установить columns[0].dataIndex="LastFirst", отрезать изменение рендера, а также получить полезную сортировку.

+1

спасибо. Я поместил код в конструктор хранилища переопределить: 'var fields = this.model.getFields();', а затем повторил через 'fields', чтобы проверить, не было ли поля. –

0

Трудно дать некоторый код или заглушку, но я нашел несколько ответов о заказе. Как я знаю, у ext 4 есть sortType в магазинах. Так что вам действительно нужно создать пользовательский sortType в вашем магазине (и создать магазин, если вы его еще не сделали).
У вас есть способы заказать вещи в сетке, используйте initComponent для других вещей.
sortType выглядит this

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