combobox появляется только после физического открытия в браузере
Создаю store беру в него все данные. Так с каждым из 4-х combobox.
Затем вешаю на событие селект одного комбобокса фильтр другого (дочернего) комбобокса. Все это работает только после того как я открыл комбобоксы и увидел в них данные. Пока я не трогал комбобоксы - выбираю в родительском какой-то пункт и открываю дочерний - и в нем все по умолчанию, не отфильтровано. Но если я открыл и закрыл один комбо и второй, а потом выбрал пункт в первом комбо - то фильтр работает. Такое впечатление, что комбо на экране есть, но их пока нет, нет у них store, а появляется, только если открыть комбо. Подскажите что сделать чтобы при открытии страницы в браузере комбо инициализировались сразу вместе с store ? Заранее спасибо! Вот код:
Ext.onReady(function(){
obj.init();
})
var obj = {
body: '',
ostore: {},
init: function(){
this.body = Ext.get('widget');
this.makeData();
this.CreateStoreAndCombo('country');
this.CreateStoreAndCombo('okrug');
this.CreateStoreAndCombo('oblast');
this.CreateStoreAndCombo('city');
},
makeData: function(){
obj.StoreObj = new Ext.data.JsonStore({
fields: ['pid', 'type', 'lexicon_key', 'lctn_name'],
root: 'data',
});
Ext.Ajax.request({
url: '/assets/components/cuz_regions/connector.php?action=getall',
method : 'POST',
success : function(response) {
var responseData = Ext.util.JSON.decode(response.responseText);
obj.StoreObj.loadData(responseData);
},
failure: function(){
alert('Error!');
}
});
},
CreateStoreAndCombo: function(name){
switch (name) {
case 'country':
var child = 'okrug';
var emptyText = 'Выберите страну';
break;
case 'okrug':
var child = 'oblast';
var emptyText = 'Выберите округ';
break;
case 'oblast':
var child = 'city';
var emptyText = 'Выберите область';
break;
case 'city':
var emptyText = 'Выберите город';
break;
}
obj.ostore[name] = Ext.apply({}, this.StoreObj);
//obj.ostore[name].load();
new Ext.form.ComboBox({
renderTo: this.body,
id:'combo_' + name,
width:300,
typeAhead: true,
autoLoad: true,
mode: 'local',
triggerAction: 'all',
emptyText: emptyText,
selectOnFocus: false,
editable: true,
valueField:'lexicon_key',
displayField:'lctn_name',
enableKeyEvents: true,
store: obj.ostore[name],
listeners: {
scope: obj,
select: {
fn:function(combo, value) {
if (name != 'city') {
var combo_obj = Ext.getCmp('combo_' + child);
alert('combo_' + child);
var rrr2 = new RegExp("^" + combo.getValue() + "$", "");
combo_obj.store.filter('pid', rrr2);
alert(rrr2);
}
}
}
}
});
}
}
То есть все работает, но у комбобоксов нет хранилищей (и соответственно данных) пока их не открыть. Как бы сделать чтобы были хранилища с данными изначально. Спасибо! |
var combo = new Ext.form.ComboBox({ .....
combo.on('afterrender', function() { combo.store.load(); }); Как то так |
Цитата:
combo.store.load(); я пробовал так, но он ругается что нет прокси: т.е. хочет подгрузить стору с нуля. А у меня скрипт заточен на то, что стора берется сначала а потом с готовой продолжается работа (копируется, фильтруется). Есть какие то функции для инициализации сторы а не для загрузки ее снова с сервера? Спасибо! |
чего то у тебя все крикись накись, зачем заполнять jsonstore через аякс вызов?
new Ext.data.JsonStore({
root :'data',
totalProperty :'total',
fields:[
{ name:'id', type:'int' }....
],
url: '/assets/components/cuz_regions/connector.php?action=getall'
})
|
Цитата:
Проблема осталась актуальна до сих пор. Даже не представляю что искать, и в чем затык. Толи события отрабатываются пока еще нет для них объекта. Толи надо найти какой-то метод для сторы или для комбо (тоже не ясно)...... Неужели никто не сталкивался? |
а вы ставили в JsonStore
autoLoad: true ? |
я что-то не понял, вы загружаете все данные и потом сортируете на клиенте в зависимости от выбора из родительских комбобоксов?
Мы на нашем проекте делали не так. Сначало загружается первый комбобоксс, в нём выбираем значение, после выбора отправляем запрос серверу с параметрами который выбрал пользователь и приходят данные для второго комбобокса, и т.д. до четвёртого
obj.StoreObj = new Ext.data.JsonStore({
fields: ['pid', 'type', 'lexicon_key', 'lctn_name'],
root: 'data',
});
вот это не будет работать в IE любой версии. Т.к. запятая после 'data' лишняя |
| Часовой пояс GMT +3, время: 17:14. |