Поле со списком ExtJs: не заполняет пользовательское значение после загрузки (forceSelection имеет значение false) - PullRequest
0 голосов
/ 26 августа 2011

В 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.

1 Ответ

1 голос
/ 26 августа 2011

Я нашел обходной путь, хотя до сих пор не понимаю, почему это необходимо:

В успешном прослушивателе после загрузки ответа json я добавляю пользовательское значение в хранилище, затем устанавливаю поле со списком на это новое добавленное значение:

success: function() {
    diagnosisStore.add({label: rec.data.diagnosis, value: rec.data.diagnosis});
    formPanel.getForm().findField('diagnosis').setValue(rec.data.diagnosis);
},

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

...