Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Dynamic loading of ComboBox (https://javascript.ru/forum/extjs/26424-dynamic-loading-combobox.html)

Tim 08.03.2012 00:44

Dynamic loading of ComboBox
 
Я новичёк в ExtJS, использую 4-ю версию. Есть comboBox:
{
	name: 'myName',
	xtype: 'combobox',
	hiddenName:'popType',
	
	store: new Ext.data.Store({

		proxy: new Ext.data.HttpProxy({url: 'php/test.php',method:'GET'}),
		
		reader: new Ext.data.JsonReader({
			root: 'topics',
			totalProperty: 'count',
			fields: [{name: 'abbr'},{name: 'name'}]
		})
	}),
	
	valueField:'abbr',
	displayField:'name',
	triggerAction: 'all',
	emptyText:'Select',
	selectOnFocus:true,
	editable: false            	
}

Сервак возвращает ответ вида (проверено в Furebug, ответ действительно приходит):
Код:

{count:"26",topics:[{"abbr":"1","name":"option1"},
{"abbr":"2","name":"option2"}, ...


Врезультате бесконечная загрузка


:help:

nekto_O 08.03.2012 11:06

Tim,
попробуйте у reader'a указать
type : 'json',
successProperty: 'success'

а в ответе еще возвращать "success": true

Tim 08.03.2012 14:31

сделал, всё равно тоже самое

nekto_O 08.03.2012 18:42

Извиняюсь что невнимательно посмотрел ваш код.
Проверил, так работает:
{
	hiddenName: 'popType',
	xtype: 'combo',
	store: Ext.create('Ext.data.Store', {
		autoLoad: true,
		proxy: {
			url: 'php/test.php',
			type: 'ajax',
			reader: {
				root: 'topics',
				type: 'json',
				totalProperty: 'count',
				successProperty: 'success'
			}
		},
		fields: [ 'abbr', 'name'],
	}),
	valueField: 'abbr',
	displayField: 'name',
	emptyText: 'Select',
	selectOnFocus: true,
	editable: false,
	queryMode: 'local'
}


autoLoad: true лучше использовать когда у вас либо приложение небольшое, либо данных немного будет в хранилище. Если же например вы хотите загружать store при нажатии триггера, можно переопределить onTriggerClick у комбобокса, например:
onTriggerClick: function() {
	if( this.getStore().getCount() == 0 ) {
		this.getStore().load({
			callback: function() {
				this.expand();
			}.bind(this)
		});
	} else {
		( this.isExpanded ) ? this.collapse() : this.expand();
	}
}

Tim 08.03.2012 20:54

nekto_O,
Спасибо, заработало наконец то. Я нашёл ещё один, более кривой, точнее совсем кривой способ: загружать массив ajax'ом и создавать combo в функции обратного вызова.

Есть ещё одна проблема.

Можно это как то исправить?

nekto_O 08.03.2012 21:36

Tim,
Можно конечно. У вас вероятно с сервера приходит отформатированный текст? Самое простое решение: в ответе не нужно html отправлять, вместо этого у комбобокса настроить в listConfig шаблон вывода записей, например:
listConfig: {
	itemTpl: '{name} - <font color="#777777">[{abbr}]</font>'
}

Tim 08.03.2012 23:28

спс


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