Как динамически присвоить значение хранилищу в ExtJS Itemselector?
Я должен заполнить значения в правом поле множественного выбора в элементе выбора элементов. Сначала мне нужно оставить это поле пустым, а затем при выборе элемента в поле со списком над ним, я должен заполнить значения соответственно. Я попробовал это и его сбой в данный момент, и ничто не кажется неправильным. Вот фрагмент кода:
var userList = GetUserList();
var aoiList = GetAOIList();
var userAOIs = "";
var selectedUser="";
var userStore = new Ext.data.ArrayStore({
fields: ['user'],
data: userList
});
var aoiStore = new Ext.data.ArrayStore({
fields: ['aoiList'],
data: aoiList
});
var userAOIStore = new Ext.data.ArrayStore({
fields: ['userAOIs'],
data: userAOIs
});
var aafp = new Ext.FormPanel({
width : 350,
frame : true,
autoHeight : true,
bodyStyle : 'padding: 2px 5px 0 2px;',
labelWidth : 100,
defaults : {
anchor : '95%',
allowBlank : false,
msgTarget : 'under'
},
items : [ {
xtype : 'combo',
fieldLabel : 'Choose User',
emptyText: "Select User...",
id : 'userId',
name : 'user',
multiSelect: false,
store: userStore,
displayField: 'user',
mode: 'local',
editable: false,
typeAhead: true,
triggerAction: 'all',
listeners:{select:{fn:function(combo, value) {
selectedUser = value.get('user');
userAOIs = myAOIs(selectedUser);
userAOIStore = new Ext.data.ArrayStore({
fields: ['userAOIs'],
data: userAOIs});
aafp.getForm().findField("itemselector").reset();
}}
},
value : selectedUser
},{
xtype: 'itemselector',
name: 'itemselector',
fieldLabel: 'AOISelector',
imagePath: 'ext-3.4.0/examples/ux/images/',
drawUpIcon:false,
drawDownIcon:false,
drawTopIcon:false,
drawBotIcon:false,
multiselects: [{
width: 250,
height: 200,
store: aoiStore,
displayField: 'aoiList'
},{
width: 250,
height: 200,
store: userAOIStore,
displayField: 'userAOIs',
valueField: 'userAOIs'
}]
}]
Сначала я усомнился в вызове "aafp.getForm(). FindField("itemselector"). Reset()" и подумал, что может быть какая-то другая функция для динамической перезагрузки элементов в форме, а не reset, которая может быть использована для сброса / Стереть данные в полях, но сброс перезагрузит содержимое. Пожалуйста, укажите ваши данные, как этого можно достичь?
Спасибо
2 ответа
Вы можете попробовать это:
1) Создайте магазины. 2) Добавьте хранилища к компонентам. 3) Когда прослушиватель 'selected' запущен, получите компонент, хранилище которого вы хотите динамически добавить, и создайте новую запись и добавьте ее в хранилище.
РЕДАКТИРОВАТЬ: попробуйте что-то вроде этого (это то, что я думаю, вы хотите), обратите внимание, что код не является точным, так как я не уверен, что именно вы хотите сделать, но он должен дать вам представление о том, что вам нужно сделать.
listeners:{select:{fn:function(combo, value) {
var selectedUser = value.get('user');
var record = Ext.data.Record.create([
'user' : selectedUser
]);
var cmp = Ext.getCmp('compId');//Get the comp that contains the store you want to add to put the cmp id here to look it up
cmp.store.removeAll();//Clear the store
cmp.store.add([record]);//Add the new record into the store
}, this}
Спасибо за ваш вклад, это было полезно.
Я обнаружил проблему: я создавал новый экземпляр Ext.data.ArrayStore, но представление было связано с предыдущим экземпляром. Поэтому я использовал предыдущий экземпляр, удалил из него все и добавил новые записи, как и предполагал болдерер. Но я обнаружил, что нам не нужно ловить дескриптор хранилища itemselector, оно автоматически обновляется с измененным хранилищем.
образец:
var tempUserAOIStore = new Ext.data.ArrayStore({
fields: ['userAOIs'],
data: [['8'], ['9']]
});
userAOIStore.removeAll();
userAOIStore.add(tempUserAOIStore.getAt(0));
userAOIStore.add(tempUserAOIStore.getAt(1));
Теперь эта возможность в ArrayStore также является проблемой для меня, поскольку магазины настолько тесно связаны, что, если я хочу сохранить оригинал в каком-то временном хранилище, он также изменяется. т.е.
если я сделаю:
B = A;
Itemselector: store = A
A.remove(some records)
Я считаю, что B также модифицируется как A модифицируется. Я отвечаю здесь, так что, думаю, придется опубликовать это как отдельный вопрос