Разгъващ се списък ExtJs: не се попълва персонализирана стойност след зареждане (forceSelection е false)

В 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 параметри.


person Mathias Conradt    schedule 26.08.2011    source източник
comment
Проверете този въпрос. Вярвам, че това е свързан проблем stackoverflow.com/questions/2023686/   -  person 0x6A75616E    schedule 26.08.2011
comment
Благодаря, но е малко по-различно. В моя случай персонализираната стойност не е част от магазина, това е смисълът. В кода дори се опитвам да направя: formPanel.getForm().findField('diagnosis').setValue(rec.data.diagnosis); но не ми позволи. Само ако стойността в setValue е част от хранилището, тя ще се попълни правилно.   -  person Mathias Conradt    schedule 26.08.2011
comment
мисля, че проблемът е, че истинските данни идват от базата данни, но магазинът е статичен... магазинът не е свързан с базата данни... в скорошния ми проект... ако имам нужда от справка за данни... ще го направя като отделен таблица.. така че съхраняването в моята комбинация винаги се извлича от база данни   -  person Egy Mohammad Erdin    schedule 26.08.2011
comment
Не виждам разлика тук, записът трябва да е запис, независимо от източника. Освен това, така или иначе дори не бих имал препратка, защото, както споменахме, персонализираната стойност дори не е част от моя магазин.   -  person Mathias Conradt    schedule 26.08.2011


Отговори (1)


Намерих заобиколно решение, въпреки че все още не виждам защо това трябва да е необходимо:

В слушателя на успеха, след като json отговорът е зареден, добавям персонализираната стойност към магазина, след което задавам комбинираното поле на тази новодобавена стойност:

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

Нямам идея защо ще трябва да добавя персонализираната стойност към магазина в този случай, когато искам да използвам setValue, докато потребителят може да въведе всичко ръчно чрез клавиатурата.

person Mathias Conradt    schedule 26.08.2011