Do not miss ExtJs. I know it could be a pain ...
For your problem, I solved like this:
I have a grid listing Italian municipalities. I want to filter by country, region and province, so I put three collections on a docked container. In the controller, I:
,init : function (application) { this.control({ ,"#municipalitiesGrid": { afterrender: this.onMunicipalitiesGridAfterRender } }); } ,onMunicipalitiesGridAfterRender: function(grid, opts) { console.info('GVD.controller.Geo->onMunicipalitiesGridAfterRender'); var store = grid.getStore(), comboCountriesMunicipalities = this.getComboCountriesMunicipalities(), storeCountries = comboCountriesMunicipalities.getStore(), comboRegionsMunicipalities = this.getComboRegionsMunicipalities(), storeRegions = comboRegionsMunicipalities.getStore(), comboProvincesMunicipalities = this.getComboProvincesMunicipalities(), storeProvinces = comboProvincesMunicipalities.getStore(); store.clearFilter(true); storeCountries.clearFilter(true); storeRegions.clearFilter(true); storeProvinces.clearFilter(true); storeRegions.filter("idCountry", 114);
In the controller, of course, I have other listeners for the select comboboxes event, so I can filter and reload the combos according to the selected values.
Following the MVC example, my stores are similar to the following:
Ext.define('GVD.store.Municipalities', { extend: 'Ext.data.Store' ,constructor: function(cfg) { console.info('GVD.store.Municipalities->constructor'); var me = this; cfg = cfg || {}; me.callParent([Ext.apply({ autoLoad: false ,autoSync: true ,model: 'GVD.model.Municipalities' ,pageSize: 20 }, cfg)]); } });
And models similar to:
Ext.define('GVD.model.Municipalities', { extend: 'Ext.data.Model', fields: [ { name: 'id', type: 'int' }, { name: 'idIstat', type: 'int' }, { name: 'idCountry', type: 'int' }, { name: 'idRegion', type: 'int' }, { name: 'idProvince', type: 'int' }, { name: 'name', type: 'string' }, { name: 'chief_town', type: 'boolean' }, { name: 'altitude_zone', type: 'int' }, { name: 'altitude', type: 'int' }, { name: 'coastal', type: 'int' }, { name: 'mountain', type: 'int' }, { name: 'surface', type: 'double' }, { name: 'residents', type: 'int' }, { name: 'icon', type: 'string' } ] ,proxy: { api: { create: 'Municipalities.create' ,destroy: 'Municipalities.destroy' ,read: 'Municipalities.read' ,update: 'Municipalities.update' } ,reader: { root: 'data' ,totalProperty: 'totalCount' ,type: 'json' } ,type: 'direct' } });
And referenced in my grid like this:
Ext.define('GVD.view.system.geo.ListMunicipalities', { autoScroll: true ,constrain: true ,dockedItems: [{ xtype: 'topBar' },{ items: [{ allowBlank: true ,fieldLabel: 'Nazione' ,flex: 1 ,id: 'comboCountriesMunicipalities' ,labelAlign: 'right' ,labelWidth: 50 ,listConfig: { getInnerTpl: function() { return '<img src="resources/images/countries/16/{icon}16.gif" align="left"> {italianName}'; } } ,store: Ext.create('GVD.store.Countries', {pageSize: 999}) ,xtype: 'comboCountries' },{ allowBlank: true ,fieldLabel: 'Regione' ,flex: 1 ,id: 'comboRegionsMunicipalities' ,labelAlign: 'right' ,labelWidth: 50 ,listConfig: { getInnerTpl: function() { return '<img src="resources/images/regions/16/{icon}16.gif" align="left"> {name}'; } } ,store: Ext.create('GVD.store.Regions', {pageSize: 999}) ,xtype: 'comboRegions' },{ allowBlank: true ,fieldLabel: 'Provincia' ,flex: 1 ,id: 'comboProvincesMunicipalities' ,labelAlign: 'right' ,labelWidth: 50 ,listConfig: { getInnerTpl: function() { return '<img src="resources/images/provinces/16/{icon}16.gif" align="left"> {name}'; } } ,store: Ext.create('GVD.store.Provinces', {pageSize: 999}) ,xtype: 'comboProvinces' }] ,layout: 'hbox' ,xtype: 'container' }, { dock: 'bottom' ,itemId: 'municipalitiesPagingToolbar' ,store: 'Municipalities' ,xtype: 'pagingToolBar' }] ,extend: 'Ext.window.Window' ,height: 400 ,icon: 'resources/images/GVD/municipalities16.png' ,id: 'listMunicipalities' ,items: [{ columns: [{ xtype: 'rownumberer' },{ align: 'right' ,dataIndex: 'id' ,format: '000' ,renderer: function(value, metaData, record, rowIndex, colIndex, store, view) { return '<img src="resources/images/municipalities/16/'+record.data.icon+'16.gif" align="left"> '+record.data.id; } ,text: 'Id' ,width: 70 ,xtype: 'numbercolumn' },{ align: 'right' ,dataIndex: 'idIstat' ,editor: { allowBlank: false, selectOnFocus: true } ,filter: { type: 'numeric' } ,format: '000000000' ,text: 'Istat' ,width: 80 ,xtype: 'numbercolumn' },{ dataIndex: 'name' ,editor: { allowBlank: false, selectOnFocus: true } ,filter: { type: 'string' } ,flex: 1 ,text: 'Denominazione' ,xtype: 'gridcolumn' },{ dataIndex: 'chief_town' ,editor: { allowBlank: false, selectOnFocus: true } ,filter: { type: 'numeric' } ,text: 'Capoluogo' ,width: 40 ,xtype: 'numbercolumn' },{ dataIndex: 'altitude_zone' ,editor: { allowBlank: false, selectOnFocus: true } ,filter: { type: 'numeric' } ,format: '0' ,text: 'Zona alt.' ,width: 40 ,xtype: 'numbercolumn' },{ align: 'right' ,dataIndex: 'altitude' ,editor: { allowBlank: false, selectOnFocus: true } ,filter: { type: 'numeric' } ,format: '0000' ,text: 'Altitudine' ,width: 40 ,xtype: 'numbercolumn' },{ dataIndex: 'coastal' ,editor: { allowBlank: false, selectOnFocus: true } ,filter: { type: 'numeric' } ,format: '0' ,text: 'Costiero' ,width: 40 ,xtype: 'numbercolumn' },{ dataIndex: 'mountain' ,editor: { allowBlank: false, selectOnFocus: true } ,filter: { type: 'numeric' } ,format: '0' ,text: 'Montano' ,width: 40 ,xtype: 'numbercolumn' },{ align: 'right' ,dataIndex: 'surface' ,editor: { allowBlank: false, selectOnFocus: true } ,filter: { type: 'numeric' } ,format: '000,000.00' ,text: 'Superficie' ,xtype: 'numbercolumn' },{ align: 'right' ,dataIndex: 'residents' ,editor: { allowBlank: false, selectOnFocus: true } ,filter: { type: 'numeric' } ,format: '0,000,000' ,text: 'residenti' ,xtype: 'numbercolumn' },{ dataIndex: 'icon' ,editor: { allowBlank: false, selectOnFocus: true } ,filter: { type: 'string' } ,flex: 1 ,text: 'Icona' ,xtype: 'gridcolumn' }] ,columnLines: true ,emptyText: '<font color="red"><b>Nessun comune in archivio</b></font>' ,features: [ Ext.create('GVD.ux.grid.FiltersFeature', { encode: true, ftype: 'filters', local: false, menuFilterText: 'Filtro' }) ] ,id: 'municipalitiesGrid' ,plugins: [ Ext.create('Ext.grid.plugin.RowEditing', { ptype: 'rowediting' }) ] ,selModel: { selType: 'checkboxmodel', mode: 'MULTI' },store: 'Provinces' ,store: 'Municipalities' ,viewConfig: { loadingText: 'Caricamento dati' ,stripeRows: true ,trackOver: true } ,xtype: 'grid' }] ,layout: { align: 'stretch' ,type: 'vbox' } ,margin: '0 0 2 0' ,maximizable: true ,minimizable: true ,requires: [ 'GVD.ux.combo.Countries' ,'GVD.ux.combo.Provinces' ,'GVD.ux.combo.Regions' ,'GVD.ux.PrintButton' ,'GVD.ux.toolbar.BottomBar' ,'GVD.ux.toolbar.PagingToolBar' ,'GVD.ux.toolbar.TopBar' ] ,singleWindow: true ,title: 'Elenco comuni' ,tools: [ { xtype: 'printButton', title: 'Elenco Comuni', tooltip: 'Stampa elenco' } ,{ type: 'help', xtype: 'tool', tooltip: 'Guida sulla funzione' } ] ,width: 760 });
Hope this helps.
goodbye