正如 lontivero 所说,过滤器可以解决您的问题:
primary:数组可以包含数据,但过滤器会将其从下拉列表中隐藏
次要:过滤器可以更改为隐藏和显示在下拉列表中
那么,您剩下的问题是如何从非 Ext 代码更改过滤器。在这里,您可以使用 Ext 只是 javascript 并且可以从与 Ext 无关的任何其他 javascript 调用的事实。
所以:
- 在 HTML DOM 可访问的位置/范围中添加一些应用过滤器以添加和删除的功能
- 将它们添加到
onclick
(纯 HTML)按钮的处理程序中
诀窍实际上是通过使用 Ext 的 id 查找来访问商店。
因此,如果以下代码(在 lontivero 的 jsfiddle 上扩展)直接在 js 文件中(或在脚本标签中),它会满足您的要求:
(jsfiddle:http: //jsfiddle.net/mCv6A/)
// functions that do the filtering
var noPablo = function(record) { return record.get('Name') !== 'Pablo' }
var noJames = function(record) { return record.get('Name') !== 'James' }
// the combination of functions we'll use
var withoutJamesFilter = [{ filterFn: noPablo }, { filterFn: noJames }]
var withJamesFilter = [{ filterFn: noPablo }]
function addJames()
{
var store = Ext.getStore('people')
store.clearFilter()
store.filter(withJamesFilter)
}
function delJames()
{
var store = Ext.getStore('people')
store.clearFilter()
store.filter(withoutJamesFilter)
}
Ext.onReady(function()
{
var store = Ext.create('Ext.data.ArrayStore', {
id: 'people',
fields: ['Id', 'Name'],
data: [
[ 1, 'Lucas' ],
[ 2, 'Pablo' ],
[ 3, 'Francisco' ],
[ 4 , 'James' ]
]
})
Ext.create('Ext.form.field.ComboBox', {
fieldLabel: 'Permissions',
displayField: 'Name',
store: store,
valueField: 'Id',
renderTo: Ext.getBody()
})
// start without james in list
store.filter(withoutJamesFilter)
})
实际使用时需要考虑的事项(而不是在简化示例中):
- wrapping
addJames
,delJames
以及它们在对象或立即函数中使用的变量(noPablo
等noJames
),因此变量不会弄乱全局(窗口)范围
- 重写过滤器变量以更好地共享实现(类似于获取名称列表并生成过滤器数组或过滤器函数来过滤掉这些名称的函数是明智的)