В ExtJs4 имам формуляр с разгъващ се списък, където данните се зареждат от базата данни в json чрез
this.getForm().load({url: '/ext/get-patient', ...
където на потребителя е разрешено да въведе персонализирана стойност освен предварително дефинираните, конфигурирани чрез атрибута forceSelection
, зададен на false.
Проблемът, който изпитвам е:
когато потребителят избере някоя от предварително зададените стойности от магазина в комбинираното поле, запази и презареди записа отново, всичко работи добре. Но когато потребителят въведе персонализирана стойност (т.е. „abcde“) в полето с разгъващ се списък, записва (и мога да видя, че въведената персонализирана стойност се съхранява правилно в базата данни) и след това отново зарежда данните на формуляра (правилна персонализирана стойност е в json отговор), комбинираното поле няма да бъде попълнено с тази персонализирана стойност след процеса на зареждане.
Защо - или как да го решим?
Това е дефиницията на магазина, използвана от комбинираното поле:
// The data store for the diagnoses combobox
var diagnosisStore = Ext.create('Ext.data.Store', {
fields: ['label', 'value'],
data: (function() {
var data = [
{label: '结膜炎', value: '结膜炎'},
{label: '角膜炎', value: '角膜炎'},
{label: '青光眼', value: '青光眼'},
{label: '白内障', value: '白内障'},
{label: '葡萄膜炎', value: '葡萄膜炎'},
{label: '屈光不正', value: '屈光不正'},
{label: '眼部异物', value: '眼部异物'},
{label: '翼状胬肉', value: '翼状胬肉'},
{label: '泪囊炎', value: '泪囊炎'},
{label: '倒睫', value: '倒睫'},
{label: '角膜溃疡', value: '角膜溃疡'},
{label: '角膜白斑', value: '角膜白斑'},
{label: '眼内炎', value: '眼内炎'}
];
return data;
})()
});
... и комбинираното поле, имайте предвид, че forceSelection
е зададено на false.
{
xtype: 'combobox',
name: 'diagnosis',
fieldLabel: lang["patient.diagnosis"],
labelWidth: 60,
flex:1,
store: diagnosisStore,
valueField: 'value',
displayField: 'label',
typeAhead: true,
queryMode: 'local',
forceSelection: false
}
Също така се опитах да изпълня този ред код в слушателя, след като json отговорът беше успешно извлечен:
formPanel.getForm().findField('diagnosis').setValue(rec.data.diagnosis);
но няма да се попълни, освен ако стойността на настройките "Аз съм" не е част от магазина. И така, защо потребителят може да въведе всичко в падащото поле, но аз не мога да направя същото със setValue в кода? За мен няма смисъл.
Редактиране/Актуализиране:
Смешното е, че въпреки че персонализираната стойност не се попълва/не се показва на потребителя, изглежда, че комбинираното поле все пак съдържа персонализираната стойност. Защото, когато извикам тази линия:
alert( formPanel.getForm().findField('diagnosis').getValue() );
всъщност ще покаже стойността, която току-що се опитах да задам чрез setValue(), в диалоговия прозорец за предупреждение. Изглежда, че този компонент на комбинираната кутия е малко бъгов.
Друг проблем, който току-що открих с това разгъващо се поле в ExtJs: Също отбелязах, че празните стойности в разгъващото се поле не се изпращат във формуляра (json параметър в заявката), само ако въведа едно празно място (" "), след което полето всъщност е включено в изпратените json параметри.