extjs 4.2组合框仅显示商店的唯一条目

时间:2014-11-06 18:12:13

标签: javascript extjs combobox

这不是有人问过这个问题的唯一时间。基本上我想知道如何过滤商店的组合框。我知道商店有一个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()中的集合,我必须删除displayFieldvalueField。我只是不知道如何让它回到组合框。除了创建一个全新的商店之外,我试图找到一种通用的方法来做到这一点。

任何帮助或想法将不胜感激。

1 个答案:

答案 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的加载方法。截至目前,我们可能不得不对此解决方案进行一些更改,因为如果我们绕过过滤器,我们将不会获得过滤的列表框,例如,您也可以按日期过滤。即使它们不在该日期范围内,您也可以在商店中获得所有可用的盒子。