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

Javascript Extjs仅在一个视图中将新元素添加到组合框存储,javascript,extjs,combobox,Javascript,Extjs,Combobox,大家好。 我在EXTjs中完成了一个巨大的项目,在一个特定的视图上,有一个选择国家的组合框,我想添加一个名为“WW”(全球)的新“虚拟国家”,仅在存储加载到这个特定点之后 我的第一次尝试是直接向应用商店添加一个侦听器,但这在应用商店的所有视图和所有位置都添加了新的国家/地区,这是一个巨大的失败,因为项目的其他部分无法处理这个虚拟国家/地区 所以我想在我必须使用它的地方直接添加这个新元素,但是我有一些问题(我对Ext非常陌生,而且我进入它的速度非常慢)。 事实上,我已经得出了这样的结论: tbar

大家好。 我在EXTjs中完成了一个巨大的项目,在一个特定的视图上,有一个选择国家的组合框,我想添加一个名为“WW”(全球)的新“虚拟国家”,仅在存储加载到这个特定点之后

我的第一次尝试是直接向应用商店添加一个侦听器,但这在应用商店的所有视图和所有位置都添加了新的国家/地区,这是一个巨大的失败,因为项目的其他部分无法处理这个虚拟国家/地区

所以我想在我必须使用它的地方直接添加这个新元素,但是我有一些问题(我对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'
                        });
                }
            }
        }

这似乎是个骗局,合法吗?我关心的是添加此国家/地区“仅一次”,因此afterRender似乎是选择的正确事件,因为组合框中不存在“load”(加载)(我在某个地方读过)

如果将其添加到存储中,则它在存储中,绑定到存储的所有视图和组件都将使用该国家/地区

如果您需要数据略有不同的存储,我只能建议使用

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

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

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');
        }
    }]
});

如果将其添加到存储中,则它位于存储中,绑定到存储的所有视图和组件都将使用国家/地区

如果您需要数据略有不同的存储,我只能建议使用

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

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

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');
        }
    }]
});

我不明白,你说的“只有一次”是什么意思?每当这个代码运行时,你的记录总是会被插入。事实上,我害怕每次用户用组合框打开面板时都会得到一个“worldwide”,但似乎afterrender只启动了一次,顺便说一下,我只得到一个世界范围的国家,现在没问题,我正在设法找出如何增强代码,但实际上这是在耍花招。我不明白,你说的“只有一次”是什么意思?每当这个代码运行时,你的记录总是会被插入。事实上,我害怕每次用户用组合框打开面板时都会得到一个“worldwide”,但似乎afterrender只启动了一次,顺便说一下,我只得到一个世界范围的国家,现在没问题,我正在设法找出如何增强代码,但事实上,这就是诀窍。不幸的是,我无法更改存储数据,因此我无法向数据中添加新字段以将其过滤掉。不幸的是,我无法更改存储数据,因此我无法向数据中添加新字段以将其过滤掉。