这不是有人问过这个问题的唯一时间。基本上我想知道如何过滤商店的组合框。我知道商店有一个collect
方法,使用它的方式如下:store.collect('column')
。问题是,在最初设置组合时使用组合框,商店还没有任何数据。我读到其他人建议在beforequery
监听器中完成此操作(并且在测试中我可以访问此时收集的商店)我遇到的问题是如何将过滤后的存储发送回组合框来自beforequery
听众?当然代码示例如下所示:(有些东西会被改变,以避免显示我们不想透露的信息)
xtype: 'combobox'
, multiSelect: true
, forceSelection: true
, store: IH.reportGroupStore
, displayField: 'group'
, valueField: 'group'
, fieldLabel: "Show group(s)"
, labelWidth: 110
, labelAlign: 'right'
, labelStyle: 'white-space: nowrap;'
, width: 275
, emptyText: 'All'
, listeners: {
beforequery: function(me, opts) {
}
, blur: function(me, opts) {
filterReportSummary();
}
, select: function(me, records, eOpts) {
filterReportSummary();
}
}
所以在beforequery里面,如果我在浏览器中暂停,我可以me.combo.store.collect('group')
查看该集合。我知道要使用store.collect()
中的集合,我必须删除displayField
和valueField
。我只是不知道如何让它回到组合框。除了创建一个全新的商店之外,我试图找到一种通用的方法来做到这一点。
任何帮助或想法将不胜感激。
答案 0 :(得分:1)
对此的简单回答是将组合框原样保留,并使用专门为您要过滤的列表设置的单独存储。在我们的示例中,我们过滤了一个框号列表,我们创建了一个ArrayStore,并使用填充网格的源存储的collect方法填充数据。您必须小心将bypassFilter
选项设置为true,以避免在列表过滤时过滤列表。 ArrayStore的代码如下所示:
boxArrayStore = Ext.create('Ext.data.ArrayStore', {
storeId: 'boxArrayStore'
, fields: ['box']
, data: [[]]
, load: function(){
var parentStore = Ext.data.StoreManager.lookup('sourceStore');
var arrayData = [];
if(parentStore) {
Ext.each(parentStore.collect('box', false, true), function(value) {
arrayData.push([value]);
});
this.loadData(arrayData);
}
}
});
我们在ArrayStore中使用load
,因为每次单击下拉列表时组合框都会调用ArrayStore的加载方法。截至目前,我们可能不得不对此解决方案进行一些更改,因为如果我们绕过过滤器,我们将不会获得过滤的列表框,例如,您也可以按日期过滤。即使它们不在该日期范围内,您也可以在商店中获得所有可用的盒子。