lontiveroが言ったように、フィルターはあなたの問題を解決します:
primary : 配列にはデータを含めることができますが、フィルターはドロップダウンから非表示にします
secondary : フィルターを変更して、ドロップダウンで表示と非表示を切り替えることができます
残りの問題は、Ext 以外のコードからフィルターを変更する方法です。ここでは、Ext は単なる JavaScript であり、Ext とは関係のない他の JavaScript から呼び出すことができるという事実を利用できます。
そう:
- HTML DOM からアクセス可能な場所/スコープに、追加および削除するフィルターを適用するいくつかの関数を追加します。
onclick
(プレーン HTML) ボタンのハンドラーにそれらを追加します。
秘訣は、ID による Ext ルックアップを使用してストアにアクセスすることです。
したがって、次のコード (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)
})
(単純化された例ではなく) 実際に使用する際の考慮事項:
- ラッピング
addJames
、delJames
およびそれらがオブジェクトまたは即時関数で使用する変数 (noPablo
などnoJames
) を使用して、変数がグローバル (ウィンドウ) スコープを乱雑にしないようにする
- フィルター変数を書き直して、実装をより適切に共有します (名前のリストを取得してフィルター配列を生成する関数や、それらの名前をフィルター処理するフィルター関数のようなものが賢明です)。