Группировка значений списков Ext.form.field.ComboBox помогает систематизировать элементы. Эта функция уже доступна в Ext.grid.Panel, но, к сожалению, недоступна для Ext.form.field.ComboBox. Для реализации данной доработки, мы будем наследоваться от ComboBox’a.
Ext.define('app.view.city.cmp.GroupComboBox', {
extend: 'Ext.form.field.ComboBox',
alias: ['widget.groupcombobox', 'widget.groupcombo'],
groupListConfig: {
groupItemCls: Ext.baseCSSPrefix + 'boundlist-group-item',
lastGroupField: false,
renderTpl: [
'<div id="{id}-listWrap" data-ref="listWrap"',
' class="{baseCls}-list-ct ', Ext.dom.Element.unselectableCls, '">',
'<ul id="{id}-listEl" data-ref="listEl" class="', Ext.baseCSSPrefix, 'list-plain"',
'<tpl foreach="ariaAttributes"> {$}="{.}"</tpl>',
'>',
'</ul>',
'</div>',
'{%',
'var pagingToolbar=values.$comp.pagingToolbar;',
'if (pagingToolbar) {',
'Ext.DomHelper.generateMarkup(pagingToolbar.getRenderTree(), out);',
'}',
'%}',
{
disableFormats: true
}
],
generateTpl: function () {
var me = this;
me.tpl = new Ext.XTemplate(
'<tpl for=".">',
'<tpl if="this.showGroupTitle(' + me.groupField + ')">',
'<li class="' + me.groupItemCls + '"> ' + me.getGroupInnerTpl(me.groupField) + '</li>',
'</tpl>',
'<li style="padding-left: 20px;" role="option" unselectable="on" class="' + me.itemCls + '">' + me.getInnerTpl(me.displayField) + '</li>',
'</tpl>',
{
lastGroupTitle: false,
showGroupTitle: function(groupTitle) {
if(groupTitle == this.lastGroupTitle) {
return false;
} else {
this.lastGroupTitle = groupTitle;
return true;
}
}
}
);
},
getInnerTpl: function(displayField) {
return '{' + displayField + '}';
},
getGroupInnerTpl: function(groupField) {
return '{' + groupField + '}';
}
},
initComponent: function() {
this.listConfig = Ext.apply(
this.groupListConfig,
this.listConfig
);
this.callParent();
this.listConfig.groupField = this.store.groupField;
}
});
Ext.data.Store который привязан к combobox должен быть с включенной группировкой (см. свойство groupField). Так же вам необходимо создать новый css класс, похожий на .x-boundlist-item, который будет называться — .x-boundlist-group-item (для темы Triton). Что бы изменить разметку элемента группировки, вам придется изменить метод GroupComboBox:getGroupInnerTpl().
Например:
getGroupInnerTpl: function (groupField) {
return '<b>Group:</b> {' + groupField + '}';
}
Fiddle: