В 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 в коде? Не имеет смысла для меня.
Редактировать / Update:
Самое смешное: даже если пользовательское значение не заполняется / не отображается пользователю, кажется, что поле со списком, тем не менее, содержит пользовательское значение. Потому что, когда я вызываю эту строку:
alert( formPanel.getForm().findField('diagnosis').getValue() );
на самом деле в диалоге предупреждения будет показано значение, которое я только что попытался установить с помощью setValue ().
Кажется, этот компонент со списком немного глючит.
Другая проблема, которую я только что обнаружил с этим полем со списком в ExtJ: Также было отмечено, что пустые значения в поле со списком не отправляются в форме (параметр json в запросе), только если я ввожу один пустой пробел ("" ), то поле фактически включается в представленные параметры json.