Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.06.2015, 10:35
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Вывод значения ComboBox которое находится на второй странице Store
Здравствуйте!

Почему не выводится значение displayField комбобокса?

Вот пример в песочнице:
https://fiddle.sencha.com/#fiddle/p4a

Если взять value=3, то все работает. Но если больше 5, то выводится число, а не текст.
Ответить с цитированием
  #2 (permalink)  
Старый 20.06.2015, 17:15
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 07.08.2013
Сообщений: 214

тут все очевидно. вы не загрузили запись с id=9 поэтому комбобокс и не может показать ничего. pageSize стоит 5 и в стор попадают 5 первых записей.
Ответить с цитированием
  #3 (permalink)  
Старый 20.06.2015, 18:04
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

То есть, чтобы показать значение displayField мне нужно вычислить страницу хранилища, переключить хранилище вручную на эту страницу? Комбик не может это сам делать разве???
Ответить с цитированием
  #4 (permalink)  
Старый 20.06.2015, 21:26
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 07.08.2013
Сообщений: 214

Никак не может, это же серверная часть. Разбиение на страницы зависит от набора данных ..клиент не знает ничего пока не получит записи.

В принципе дело решается на сервере элементарно. Например - всегда первой записью возвращайте выбранную, а дальше уже записи страницы. И будет выбранное значение всегда показано как надо.
Ответить с цитированием
  #5 (permalink)  
Старый 20.06.2015, 21:32
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Так... что то тут не то. Сервер не в курсе какая форма, какой грид открыт на клиенте. Так что он ничего не может вернуть. А комбик мог бы перед отрисовкой запрашивать через модель хранилища. Я думал что он так и будет делать. Придется дописать эту функцию в него, раз все так печально.
Ответить с цитированием
  #6 (permalink)  
Старый 21.06.2015, 09:13
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 07.08.2013
Сообщений: 214

У combobox есть store вот оттуда он и берет всё для работы (value/display value). На этом всё собственно по поводу источника его данных.

Про "ничего не может вернуть" я не понял.. Я про формы/гриды ничего не писал какбы. Вот варианты вчерне:

1) в load запрос добавляете extra param pageById=id_значения, если он приходит сервер возвращает страницу store содержащую указанную запись

2) в load запрос добавляете extra param addId=id_значения, если он приходит сервер возвращает страницу store + запись с id=addId:
// клиент попросил добавить к набору запись с id=addId
select * from foo where id=:addId
union
select * from foo where ... limit :startRecord, :endRecord

3) ставите queryMode в local и загружаете записи в стор - както по своему
Ответить с цитированием
  #7 (permalink)  
Старый 21.06.2015, 10:18
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Комбобокс это мог бы и сам делать. Например банально при каждом load в extra params передавать значение value (аналогично как он это делает при поиске, передавая искомую строку в query). Чего это он сразу не делает - не ясно.
Ответить с цитированием
  #8 (permalink)  
Старый 21.06.2015, 10:39
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Вот как я себе это представляю:

xtype: "combobox",
fieldLabel: "Физическое лицо",

name: "document_parent_id",
bind: "{record.document_parent_id}",

displayField: "contractor_title",
valueField: "document_id",

store: {

	type: "individuals",

	myparam: "",
	setMyparam: function(myparam) {
		this.myparam = myparam;
	},
	bind: {
		myparam: "{record.document_parent_id}"
	},

	listeners: {
		beforeload: function(store, operation) {
			operation.setParams(Ext.Object.merge(operation.getParams() || {}, {
				myparam: store.myparam
			}));
		}
	}

}


Правда пока поле myparams не биндуется, так что эту проблему надо будет потом как-то решать.

Но зато, при каждой загрузке сторе на сервер передается myparam, внутри которого значение комбобокса. И на его основании сервер может подготовить ответ, где будет содержаться нужный display value.

Потом это оформить в свой собственный класс ComboboxStore и вуаля, все комбики будут нормально отображать display value.

Но у меня есть подозрение, что комбик это уже может... но каким образом его настроить по задумке сенчи не могу сообразить пока.

Иными словами, мне не хотелось бы ИЗВНЕ дергать каждый сторе каждого комбобокса. Лучше если комбик сам все это делает.

Последний раз редактировалось khusamov, 21.06.2015 в 10:50.
Ответить с цитированием
  #9 (permalink)  
Старый 21.06.2015, 11:07
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Не знаю как забиндить это дело, похоже надо миксин Bindable внедрять.

Пока сделал хаками:

Ext.define("MyApp.override.form.field.ComboBox", {
	override: "Ext.form.field.ComboBox",
	
	config: {
		comboboxParam: "combobox"
	},
	
	initComponent: function() {
		this.callParent();
		this.store.combobox = this;
	},
	
});

Ext.define("MyApp.override.data.Store", {
	override: "Ext.data.Store",
	
	listeners: {
		beforeload: function(store, operation) {
			if ("combobox" in store && store.combobox instanceof Ext.form.field.ComboBox) {
				var params = {};
				params[store.combobox.getComboboxParam()] = store.combobox.getValue();
				operation.setParams(Ext.Object.merge(operation.getParams() || {}, params));
			}
		}
	}
	
});


Проверил, работает. Значение comboboxParam передается на сервер (то есть под этим именем передается значение комбобокса, а сервер уже сам решает что с ним делать). Имя параметра comboboxParam можно менять прямо в комбобоксе (аналогично как меняется к примеру queryParam):

xtype: "combobox",
comboboxParam: "mycombobox"


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

Причем неизвестно как поведет себя комбобокс, если эта запись при листании выпадающего списка пропадет (хотя если comboboxParam будет постоянно передаваться, то не пропадет). А если не пропадет - будет постоянно на глазах у изумленного пользователя (ему же не понятно, почему эта запись присутствует на всех страницах). Эта проблема частично решается, если сервер будет просматривать запрос на наличие параметра query (если он есть, то comboboxParam надо игнорировать). Частично потому, что имя query клиентом может быть изменено. Также myparam можно игнорировать если page>1. (Кстати, если query не пустой, то comboboxParam=query.)

В общем неплохо было бы потом переделать это поведение комбобокса, чтобы он display value брал не из store, а отдельно загружал, используя модель store (при условии, что прокси описан в модели и что value совпадает с id модели... блин, много всяких условий однако...).

Последний раз редактировалось khusamov, 21.06.2015 в 11:57.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование combobox поля в grid dionic ExtJS 0 26.05.2011 14:12