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, время: 03:17. |