Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript extjs 4.2组合框仅显示存储区的唯一条目_Javascript_Extjs_Combobox - Fatal编程技术网

Javascript extjs 4.2组合框仅显示存储区的唯一条目

Javascript extjs 4.2组合框仅显示存储区的唯一条目,javascript,extjs,combobox,Javascript,Extjs,Combobox,这不是唯一一次有人问这个问题。基本上我想知道如何过滤商店中的组合框。我知道商店有一个collect方法,它的工作原理如下:store.collect('column')。问题是,在最初设置组合时使用组合框,存储区还没有将任何数据放入其中。我阅读了其他人建议在beforequery侦听器中执行此操作的地方(在测试中,我可以在此时访问存储的集合),我遇到的问题是如何从beforequery侦听器将过滤后的存储发送回组合框?当然,代码示例如下所示:(某些内容将被更改,以避免显示我们不想提供的信息) 因

这不是唯一一次有人问这个问题。基本上我想知道如何过滤商店中的组合框。我知道商店有一个
collect
方法,它的工作原理如下:
store.collect('column')
。问题是,在最初设置组合时使用组合框,存储区还没有将任何数据放入其中。我阅读了其他人建议在
beforequery
侦听器中执行此操作的地方(在测试中,我可以在此时访问存储的集合),我遇到的问题是如何从
beforequery
侦听器将过滤后的存储发送回组合框?当然,代码示例如下所示:(某些内容将被更改,以避免显示我们不想提供的信息)

因此,在beforequery中,如果我在浏览器中暂停,我可以执行
me.combo.store.collect('group')
并查看集合。我知道要从
store.collect()
中使用集合,我必须删除
displayField
valueField
。我只是不知道如何把它放回组合框。除了创建一个全新的商店之外,我还试图找到一种通用的方法来实现这一点


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

这个问题的简单答案是保持组合框的原样,使用专门为要筛选的列表设置的单独存储。在我们的示例中,我们过滤一个箱号列表,创建一个ArrayStore,并使用填充网格的源存储的collect方法填充数据。您必须小心地将
旁路过滤器
选项设置为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的load方法。到目前为止,我们可能必须对此解决方案进行一些更改,因为如果我们绕过过滤器,我们将无法获得已过滤的框列表,例如,如果您也按日期进行过滤。即使不在该日期范围内,您也可以获得商店中所有可用的盒子

我在下面添加了对我们有用的答案。如果它对你也有效,请投票。
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);
        }
    }
});