Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.03.2011, 16:45
Аспирант
Отправить личное сообщение для Petja Посмотреть профиль Найти все сообщения от Petja
 
Регистрация: 13.03.2011
Сообщений: 57

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);
						}
					}
				}
			}
		});
	}
}


То есть все работает, но у комбобоксов нет хранилищей (и соответственно данных) пока их не открыть. Как бы сделать чтобы были хранилища с данными изначально.

Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 14.03.2011, 10:55
VKS VKS вне форума
Профессор
Отправить личное сообщение для VKS Посмотреть профиль Найти все сообщения от VKS
 
Регистрация: 24.09.2010
Сообщений: 178

var combo = new Ext.form.ComboBox({ .....

combo.on('afterrender', function() {
combo.store.load();
});

Как то так
Ответить с цитированием
  #3 (permalink)  
Старый 15.03.2011, 16:46
Аспирант
Отправить личное сообщение для Petja Посмотреть профиль Найти все сообщения от Petja
 
Регистрация: 13.03.2011
Сообщений: 57

Сообщение от VKS Посмотреть сообщение
var combo = new Ext.form.ComboBox({ .....

combo.on('afterrender', function() {
combo.store.load();
});

Как то так
Привет!
combo.store.load();
я пробовал так, но он ругается что нет прокси: т.е. хочет подгрузить стору с нуля. А у меня скрипт заточен на то, что стора берется сначала а потом с готовой продолжается работа (копируется, фильтруется).
Есть какие то функции для инициализации сторы а не для загрузки ее снова с сервера?
Спасибо!
Ответить с цитированием
  #4 (permalink)  
Старый 15.03.2011, 17:16
VKS VKS вне форума
Профессор
Отправить личное сообщение для VKS Посмотреть профиль Найти все сообщения от VKS
 
Регистрация: 24.09.2010
Сообщений: 178

чего то у тебя все крикись накись, зачем заполнять jsonstore через аякс вызов?
new Ext.data.JsonStore({
		root		:'data',
		totalProperty	:'total',
		fields:[
		    { name:'id', type:'int' }....
		],
		url: '/assets/components/cuz_regions/connector.php?action=getall'
	    })
Ответить с цитированием
  #5 (permalink)  
Старый 17.03.2011, 13:47
Аспирант
Отправить личное сообщение для Petja Посмотреть профиль Найти все сообщения от Petja
 
Регистрация: 13.03.2011
Сообщений: 57

Сообщение от VKS Посмотреть сообщение
чего то у тебя все крикись накись, зачем заполнять jsonstore через аякс вызов?
Ну это все просто так, для разделения кусков кода было сделано.
Проблема осталась актуальна до сих пор. Даже не представляю что искать, и в чем затык. Толи события отрабатываются пока еще нет для них объекта. Толи надо найти какой-то метод для сторы или для комбо (тоже не ясно)......

Неужели никто не сталкивался?
Ответить с цитированием
  #6 (permalink)  
Старый 21.03.2011, 16:48
Новичок на форуме
Отправить личное сообщение для Opts Посмотреть профиль Найти все сообщения от Opts
 
Регистрация: 04.10.2010
Сообщений: 9

а вы ставили в JsonStore
autoLoad: true
?
Ответить с цитированием
  #7 (permalink)  
Старый 21.03.2011, 16:50
Новичок на форуме
Отправить личное сообщение для Opts Посмотреть профиль Найти все сообщения от Opts
 
Регистрация: 04.10.2010
Сообщений: 9

я что-то не понял, вы загружаете все данные и потом сортируете на клиенте в зависимости от выбора из родительских комбобоксов?
Мы на нашем проекте делали не так. Сначало загружается первый комбобоксс, в нём выбираем значение, после выбора отправляем запрос серверу с параметрами который выбрал пользователь и приходят данные для второго комбобокса, и т.д. до четвёртого

obj.StoreObj = new Ext.data.JsonStore({
            fields: ['pid', 'type', 'lexicon_key', 'lctn_name'],
            root: 'data',
        });

вот это не будет работать в IE любой версии. Т.к. запятая после 'data' лишняя

Последний раз редактировалось Opts, 21.03.2011 в 16:53.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему скрипт срабатывает только после обновления страницы? Randomizer jQuery 2 01.09.2010 19:01
Событие hover только после 2 секунд niksan jQuery 7 12.08.2010 14:16
переход по ссылке только после нескольких кликов по ней smilexpo Events/DOM/Window 8 24.11.2009 16:57