我有一个工作的EditorGrid面板,其中两列有ComboBox编辑器。两个ComboBox都是从数据库(countryStore
和cityStore
)远程加载的。
我想限制cityComboBox
仅显示所选国家/地区的城市。我需要使用数据库中的过滤器重新加载cityStore
(有太多城市要过滤localy)。过滤器值为countryComboBox
值。
countryComboBox中总有一个值,因为我在创建新记录时添加了默认值= 1,所以这不是问题。
我不知道哪个听众适合这里。我需要抓住双击国家/地区单元格的那一刻,countryComboBox
显示并在显示之前过滤组合框(或在检索数据时显示等待消息)。
如果无法做到这一点,我是否可以通过双击一个单元格打开一个弹出窗口,从已过滤城市的组合框中选择“确认”并将值输入单元格?
答案 0 :(得分:5)
我终于成功了。我创建了两个解决方案 - 用于网格内的本地和远程下拉搜索。最后,我决定使用本地搜索(我可以将country_id
添加到我的cities
查询并在ExtJS中进行过滤),但是可以将其用于远程搜索 - 如果有人需要,我也可以准备这个解决方案。
LOCAL SOLUTION
我必须使用beforeQuery事件过滤cityCombo
,使用同一行中来自countryCombo
的id。这是cityCombo
的代码:
var cityCombo = new Ext.form.ComboBox({
triggerAction: 'all',
mode: 'local',
lastQuery: '', // to make sure the filter in the store is not cleared the first time the ComboBox trigger is used
store: cityDropdownStore,
displayField: 'city',
valueField: 'city_id',
listeners: {
beforeQuery: function(query) {
currentRowId = myGrid.getSelectionModel().getSelected().data.country_id;
this.store.clearFilter();
this.store.filter( { property: 'country_id', value: currentRowId, exactMatch: true } );
}
}
});
如您所见,当双击网格中的cityCombo
时,我会在当前行中获得country_id
并使用该值过滤cityStore
。这需要cityStore
包含以下字段:id
,country_id
,city
仍然存在一个问题:当用户更改countryCombo
时,城市字段应更改/警告用户当前国家/地区不正确。对此的解决方案很复杂......您可能知道,您无法获得对comboBox的parentGrid的引用(否则您只能调用countryCombo --> parentGrid --> currentRecord --> cityCombo --> change it
)。
我尝试在网格上听取rowchange事件,但如果用户在更改countryCombo
后直接点击了另一行,则会更改错误行的城市。
解决方案有点先进:我必须从网格的beforeedit事件中将当前行的引用复制到cityCombo。这是网格的监听者:
listeners: {
beforeedit: function(e) {
// reference to the currently clicked cell
var ed = e.grid.getColumnModel().getCellEditor(e.column, e.row);
if (ed && ed.field) {
// copy these references to the current editor (countryCombo in our case)
Ext.copyTo(ed.field, e, 'grid,record,field,row,column');
}
}
},
现在我们的countryCombo
拥有在城市变更时重置城市所需的所有信息。这是整个countryCombo
代码:
var countryCombo = new Ext.form.ComboBox({
id: 'skupina_combo',
typeAhead: true,
triggerAction: 'all',
lazyRender: true,
mode: 'local',
store: countryDropdownStore,
displayField: 'country',
valueField: 'country_id',
listeners: {
change: function(t, n, o) { // t is the reference to the combo
// I have t.record available only because I copied it in the beforeEdit event from grid
t.record.set('city_id', '0');
}
}
});
单元格渲染器在过滤商店时没有问题,因此我只需要一个商店进行渲染和组合框编辑(cityStore)。
远程解决方案要求我为城市创建两个商店 - cityRendererStore
和cityDropdownStore
,每次查询数据库而不是使用过滤器。如果您有太多城市需要在本地过滤,那么这种方法是必要的。我应该提到我在我的应用程序中并没有真正使用城市和国家,我只是创建了这个例子来简化事情。
我对最终结果非常满意 - 它提供了网格的所有好处以及通常仅在表单中提供的条件下拉列表。
答案 1 :(得分:1)
我可以在这看到几个选项。您可以捕获商店的update
事件(当基础记录更新或标记为脏时)或捕获countryComboBox的select
事件。这两个都将为您提供所选国家/地区的ID值,然后您可以将其添加到cityComboBox的baseParams
进行远程过滤。