Extjs仅在一个视图中向组合框存储添加新元素

时间:2017-04-20 08:36:55

标签: javascript extjs combobox

美好的一天。 我在EXTjs完成了一个庞大的项目,在一个特定的视图中,有一个组合框用于选择国家,我想添加一个新的虚拟国家"叫" WW" (WorldWide),就在商店仅在此特定点加载之后。

我的第一次尝试是直接向商店添加一个监听器,但这在所有视图和商店使用的所有地方添加了新国家,这是一个很大的失败,因为项目的其他部分都没有建成处理这个虚拟国家。

所以我想直接在我必须使用它的地方添加这个新元素,但是我遇到了一些问题(我对Ext很新,而且我很慢地进入它) 。 实际上我已经得到了类似的东西:

tbar: [
        {
            xtype: 'adcombobox',
            displayField: 'name',
            id:'formCountry',
            reference: 'formcountry',
            valueField: 'id',
            store: 'Countries',
            value: 0,
            minChars: 0,
            queryMode: 'local',
            typeAhead: true,
            forceSelection: true,
            allowBlank: false,
            emptyText: 'Select a country',
            listConfig: {
                itemTpl: [
                    '<div><span class="" style="margin-right: 10px;"><img src="resources/flags/{id}.png"></span>{name}</div>'
                ]
            },
            listeners: {
                select: 'onCountrySelect',
                onLoad: function(store) {
                        store.insert(0, {
                            id:"ww",
                            shortCode: 'WW',
                            name: 'WorldWide'
                        });
                }
            }
        }

这没有任何作用。 我不确定我是否在调用错误的事件,或者某事...... 有人可以帮我吗?你能引导我走向正确的道路吗? 我也使用了#34; load&#34;事件,没有成功。

更新1:

此刻我已经提供了这个解决方案:

listeners: {
                select: 'onCountrySelect',
                afterRender: function(store) {
                        this.getStore().insert(0, {
                            id:"ww",
                            shortCode: 'WW',
                            name: 'WorldWide'
                        });
                }
            }
似乎成功的伎俩,是否合法?我担心的是只添加一次这个国家&#34;所以afterRender似乎是正确的选择事件,因为&#34;加载&#34;组合框中没有(我在某处读过)..

1 个答案:

答案 0 :(得分:0)

如果您将其添加到商店,它就在商店中,并且绑定到商店的所有视图和组件都将使用该国家/地区。

如果您需要的数据略有不同的商店,我只推荐使用ChainedStore

您必须注意的主要限制是,在链式存储中,您可以过滤掉源中仍然可用的数据;你无法添加数据。

因此,您将从包含应该在任何位置显示的所有数据的商店开始,然后筛选出您不希望在某些组件/视图中显示的内容:

Ext.define('AllCountries',{
    extend:'Ext.data.Store',
    storeId: 'AllCountries',
    inlineData:[{
        name: 'France',
        fictional: false
    },{
        name: 'Germany',
        fictional: false
    },{
        name: 'Middle-earth',
        fictional: true
    }]
});

Ext.define('FictionalCountries',{
    extend: 'Ext.data.ChainedStore',
    storeId: 'FictionalCountries',
    source: 'AllCountries',
    filters:[{
        filterFn:function(country) {
            return country.get('fictional');
        }
    }]
});

Ext.define('NonFictionalCountries',{
    extend: 'Ext.data.ChainedStore',
    storeId: 'NonFictionalCountries',
    source: 'AllCountries',
    filters:[{
        filterFn:function(country) {
            return !country.get('fictional');
        }
    }]
});