Manche Dinge, die in Standard – HTML so gewohnt einfach und selbstverständlich daherkommen, dass die Erstellung für einen Programmierer ein paar Sekunden dauern, können einen Einsteiger in DOM und speziell in Extjs 3.1 Tage abverlangen.
Ein Selectfield in HTML ist schnell geschrieben. Die selected-Option auf ein bestimmtes Value noch schneller gesetzt.
in HTML sag ich einfach
<select id ="" name="" >
<option value="id" selected>ein optionvalue</option>
</select>
fertig. Das Value ist voreingestellt.
In Extjs gibts die Komponente “combo” dafür. Sieht echt toll aus und man hat viele Ajaxoptions dafür.
Sie ist auch leicht erstellt.
{
xtype: 'combo',
id: 'username',
fieldLabel: 'Username',
hiddenName: 'userID',
emptyText: 'Select a username...',
store:
new Ext.data.SimpleStore({
fields: ['userID','username'],
data: [['1','cocomin'],['2','testuser']]
}), // end of Ext.data.SimpleStore
displayField: 'username',
valueField: 'userID',
selectOnFocus: true,
mode: 'local',
typeAhead: true,
editable: false,
triggerAction: 'all',
valueField: 'userID',
value: '1',
}
Ja, ist doch easy. Klar. Leicht und verständlich.
Ja. Wenn man folgendes berücksichtigt schon.
1) Wenn man weis, dass man für die Options einen Datastore erstellen muss
2) das forceSelection auf true stehen muss
3) das der hiddenvalue (zb userid). der variablenname im request ist
4) das man den Diplayvalue explizit setzen muss
(in diesem Fall displayField: ‘,valueField: ‘username’,)
5) Das die Verwendung eines lokalen Datastores immer mode:local benötigt. (mode:remote versucht einen jsonstring vom server in den Store zu laden)
6) und das ist das wichtigste in Bezug auf vorselectierte Options
value:’Herr Kannengiesser’ setzt einerseits einfach einen Direktvalue. Tut man das so wird jedoch nur der Value übertragen (”Herr Kannengiesser”), weil er ja keine dazugehörige ID kennt. Klar soweit.
Verwendet man jedoch eine ID (z.B.valueField: ‘userID’, value=’1′) aus dem Datastore zeigt er nicht etwa die ID an. Nein, gut erkannt, er sucht im Datastore zuerst eine ID zum Value=’1′. Exsitiert diese ID im Datastorte zeigt er statt “1″ (value:’1′) den value unter “value:’1′” an. Hierzu muss man den Valuefield auf den Key im Store setzen (valueField: ‘userID’),
Dieser ist dann auch fein selected. Im Request kommt dann brav unter $_REQUEST[userID] (hiddenvalue:’userID’) die “1″ als userID an.
Die Doku und das Forum dazu dazu ist so umfangreich, dass ich von Hacks bis zum dynamischen Nachladen bis über eingeharkte HTML Selectfields in Panelkonstrukten alles gefunden und ausprobiert habe.
Ein “selectedValueInStore” wäre eine feine Sache gewesen.. Nunja. Ich freue ich mich nun über die gefundene Lösung und dass ich vielleicht jemandem die 2 Tage Suche sparen kann.
KISS. Keep it short and simple………..