Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   combobox появляется только после физического открытия в браузере (https://javascript.ru/forum/extjs/15793-combobox-poyavlyaetsya-tolko-posle-fizicheskogo-otkrytiya-v-brauzere.html)

Petja 13.03.2011 16:45

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


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

Спасибо!

VKS 14.03.2011 10:55

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

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

Как то так

Petja 15.03.2011 16:46

Цитата:

Сообщение от VKS (Сообщение 96424)
var combo = new Ext.form.ComboBox({ .....

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

Как то так

Привет!
combo.store.load();
я пробовал так, но он ругается что нет прокси: т.е. хочет подгрузить стору с нуля. А у меня скрипт заточен на то, что стора берется сначала а потом с готовой продолжается работа (копируется, фильтруется).
Есть какие то функции для инициализации сторы а не для загрузки ее снова с сервера?
Спасибо!

VKS 15.03.2011 17:16

чего то у тебя все крикись накись, зачем заполнять jsonstore через аякс вызов?
new Ext.data.JsonStore({
		root		:'data',
		totalProperty	:'total',
		fields:[
		    { name:'id', type:'int' }....
		],
		url: '/assets/components/cuz_regions/connector.php?action=getall'
	    })

Petja 17.03.2011 13:47

Цитата:

Сообщение от VKS (Сообщение 96668)
чего то у тебя все крикись накись, зачем заполнять jsonstore через аякс вызов?

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

Неужели никто не сталкивался?

Opts 21.03.2011 16:48

а вы ставили в JsonStore
autoLoad: true
?

Opts 21.03.2011 16:50

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

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

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


Часовой пояс GMT +3, время: 03:17.