I have an ExtJS ComboBox which is linked to data which is id and name. I have the valueField set to the id and the displayField set to the name. The data is loaded from a JsonStore.
What I want to do is to be able to change the name for a given id in place by editing the textfield part of the combobox.
I've got this mostly working by listening to the change event. The change event gets called with a newValue set to the new displayField. I can then change that in the database and reload the store. However, when I move the focus off the combobox the change event gets called again with an id. I do not have a reliable way to differentiate between a change of the text and a change of the selection.
Code follows. Many thanks for any help.
var nameCombo = new Ext.form.ComboBox({
fieldLabel: 'Name',
name: 'trailName',
xtype: 'combo',
store: nameStore,
valueField: 'id',
displayField: 'name',
typeAhead: true,
mode: 'local',
triggerAction: 'all',
emptyText: 'Select the author for this book...',
//selectOnFocus:true,
listeners:{
scope: book,
'select': function(combo, record, index) {
this.authorId = combo.getValue();
saveBook(this);
},
'change': function(field, newValue, oldValue) {
alert ('change: field.value [' + field.getValue() + '], newValue [' + newValue + '], oldValue [' + oldValue + '], segmentId [' + this.id + ']');
if (oldValue == '') {
alert('create trail');
var authorDto = { name: newValue, bookId: book.id };
Ext.Ajax.request({
url : '/RestWAR/personal/book.json',
method : 'POST',
headers : {'Content-Type': 'application/json'},
jsonData : authorDto,
scope : this,
success : function(response, opts) {
var responseObject = Ext.decode(response.responseText);
bookStore.reload();
this.authorId = responseObject.authorId;
// Difficult to access the combobox so let's save directly.
saveTrailSegment(this);
}
});
} else {
alert('change trail');
var authorDto = { name: newValue, bookId: book.id };
Ext.Ajax.request({
url : '/RestWAR/personal/book/' + oldValue + '.json',
method : 'PUT',
headers : {'Content-Type': 'application/json'},
jsonData : authorDto,
scope : [field, oldValue],
success : function(response, opts) {
this[0].store.on('load',
this[0].setValue.createDelegate(this[0], [this[1]]), null, {single: true}
);
this[0].store.reload();
}
});
}
}
}
});