Я думаю, что у меня есть очень популярная проблема, но я не нашел ответа на нее сейчас. :) У меня есть 2 похожих поля со списком - сначала я установил свое значение по идентификатору - comboT.setValue("22763");
, и он правильно установил текстовое значение, связанное с этим идентификатором. Во втором выпадающем списке я сначала перезагружаю магазин (jsonstore), а затем устанавливаю значение - comboC.setValue("3");
Но этот комбо устанавливает только идентификатор, а не текстовое значение (если я открою список, я увижу, какое комбо правильно пометило текстовое значение. И после (если список просто закрыть без выбора ) текстовое значение корректно отображается при комбо.Как решить эту проблему?Спасибо.
ExtJS: Combobox после перезагрузки хранилища не устанавливает значение
Ответы (4)
Что-то вроде этого, синтаксис может немного отличаться, так как я делаю это по памяти:
var val = 3;
var store = comboC.getStore();
store.on("load", function() {
comboC.setValue(val);
}):
store.load();
Загрузка хранилища является асинхронной, вы можете захотеть переместить установку нового значения в обработчик событий callback:
для store.load({...})
, потому что в противном случае вы устанавливаете значение до фактической загрузки хранилища.
РЕДАКТИРОВАТЬ: для полноты примера, поэтому у вас есть альтернативная версия (в некоторых случаях может быть нежелательно привязывать обратный вызов к самому хранилищу, как это сделал ormuriauga):
var val = 3;
var store = comboC.getStore();
store.load({
callback: function() {
comboC.setValue(val);
}
});
Еще один пример того, как установить значение поля со списком путем поиска строки в базовом хранилище данных. Я смог закодировать это, используя образцы в этих ответах в качестве основы:
//The store's data definition must have at least a data.id field defined
set_combobox_value_from_store = function (combobox, valueField, value) {
//Get a reference to the combobox's underlying store
var store = combobox.getStore();
store.load({
callback: function () {
//Find item index in store
var index = store.find(valueField, value, false);
if (index < 0) return;
//Get model data id
var dataId = store.getAt(index).data.Id;
//Set combobox value and fire OnSelect event
combobox.setValueAndFireSelect(dataId);
}
});
В extjs 4.1 похоже, что combo.setValue() работает, когда тип valueField в модели — «строка». это был мой код
Ext.define('Model.CboObras', {
extend: 'Ext.data.Model',
idProperty: 'co_obra',
fields: [{
name: 'co_obra',
type: 'int'
}, {
name: 'nb_obra',
type: 'string'
}]
});
это не работает.
Когда я изменил свой код на это:
Ext.define('Model.CboObras', {
extend: 'Ext.data.Model',
idProperty: 'co_obra',
fields: [{
name: 'co_obra',
type: 'string'
}, {
name: 'nb_obra',
type: 'string'
}]
});
После этого я использую это:
var store = comboC.getStore();
store.load({
callback: function() {
comboC.setValue(val);
}
});
теперь это работает как шарм!