2010-03-24 3 views
0

У меня возникла интересная проблема при использовании комбо в форме ввода. Моя форма содержит комбо, которые получают данные из json-магазинов. Он отлично работает при добавлении новой записи, но когда форма открывается для редактирования существующей записи, иногда идентификатор отображается как выбранное не его значение (например: вместо 5 «яблоко») есть 5. Я думаю, он пытается установить значение, прежде чем он закончит загрузку комбо.Проблема с настройкой компиляции ExtJS

Есть ли способ решить эту проблему? я поставил код здесь, что создает комбо:

function dictComboMaker(store, fieldLabel, hiddenName, name, allowBlank, myToolTipp) { 
     comboo = { 
     xtype : 'combo', 
     id: 'id-'+name, 
     allowBlank: allowBlank, 
     fieldLabel : fieldLabel, 
     forceSelection : true, 
     displayField : 'value', 
     valueField : 'id', 
     editable: false, 
     name: name, 
     hiddenName : hiddenName, 
     minChars : 2, 
     mode: 'remote', 
     triggerAction : 'all', 
     store : store 
    }; 


    function dictJsonMaker(url) { 
     store = new Ext.data.JsonStore({ 
     root : 'results', // 1 
     fields : [ 'id','value' ], 
     url : url, 
     autoLoad: true}); 

     return store; 
    } 


    var comboKarStore = dictJsonMaker('/service/karok'); 
    var comboKar= dictComboMaker(comboKarStore, 'Kar', 'karid', 'kar', false, ''); 

    // then comboKar is added to the form 

Hubidubi

ответ

3

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

plugins: new Application.plugins.comboloadvalue(), 

в комбо-конфигурации объекта

Ext.ns('Application.plugins'); 

Application.plugins.comboloadvalue = Ext.extend(Ext.util.Observable, { 
field : null, 

init : function(field){ 
    var self = this; 
    this.field = field; 
    this.store = field.getStore(); 
    this.setLoaded(false); 

    this.store.on('load', function(){ 
     return self.onLoad(); 
    }, this); 
}, 

onLoad : function(){ 
    if(this.store !== null){ 
     this.field.setValue(this.field.getValue()); 
     this.setLoaded(true); 
    } 
    return true; 
}, 

setLoaded: function(bool){ 
    this.store.hasOnceLoaded = bool; 
}, 

getLoaded: function(){ 
    return this.store.hasOnceLoaded; 
} 

}); 
1

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

var comboKar, comboKarStore = dictJsonMaker('/service/karok'); 

comboKarStore.on('load', function(){ 
    comboKar = dictComboMaker(comboKarStore, 'Kar', 'karid', 'kar', false, ''); 
}); 
0

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

Добавить этот хак где-то, прежде чем загружать любые комбо (не должно быть после того, как документ готов)

Ext.form.ComboBox.prototype.nativeSetValue = Ext.form.ComboBox.prototype.setValue; 
Ext.form.ComboBox.prototype.setValue=function(v){ 
    var combo = this; 
    if(this.valueField){ 
     var r = this.findRecord(this.valueField, v); 
     if (!r) { 
     var data = {} 
     data[this.valueField] = v 
     this.store.load({ 
      params:data, 
      callback:function(){ 
       combo.nativeSetValue(v) 
      } 
     }) 

     } else return combo.nativeSetValue(v); 
    } else combo.nativeSetValue(v); 
}   

В основном это проверит, находится ли ваше значение в вашем магазине, а если нет, выполните обратный вызов со значениемField = значение, а затем повторите попытку. Вам просто нужно убедиться, что обработчик вашего сервера ищет «запрос» для поиска и поле ключа для загрузки.

Это также имеет преимущество в работе с комбинациями типа «поиск», которые могут иметь загруженный магазин, но с неправильными записями

Смежные вопросы