EXTJS Комбинированная задача - PullRequest
0 голосов
/ 16 августа 2010

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

Я проверяю счетчик магазина комбо и возвращает ноль, это означает, что выбор сделан до загрузки комбо.я пытаюсь установить значение в событии load и fire select, но это не работает. Это работает хорошо, когда я повторно выбираю другую запись в это время, загружается хранилище.1005 * Проблема настройки комбо ExtJS

Есть ли какой-нибудь способ задать его текст?

Кто-нибудь может дать мне правильный номер, пожалуйста?

Ответы [ 5 ]

0 голосов
/ 04 мая 2011

Иногда появляется идентификатор, потому что в вашем коде условие гонки . Фактически, если хранилище было загружено, оно покажет отображаемое значение, в противном случае просто идентификатор.

Я проверил это в своем собственном коде. Хранилище загружается намного быстрее, чем вызов Ajax для получения значения инициализации (потому что я записал в память первый вызов). Поскольку хранилище было загружено первым, вызов setValue () с идентификатором работал отлично.

Однако, когда я попытался намеренно замедлить загрузку Ajax-вызова из магазина, показывался только идентификатор, а не отображаемое значение. Итак, я видел ответы, говорящие, что для решения этой проблемы вы должны использовать autoLoad: true в ComboBox. Использование автозагрузки нормально, но недостаточно. Вы хотите быть уверены, что при установке значения хранилище уже загружено. Для этого просто поместите слушатель в событие загрузки магазина:

var dataStore = new Ext.data.JSonStore({
    url: 'your-url',
    root: 'records',
    fields: ['id', 'name'],
    autoLoad: true,
    listeners: { 
        load: function () {
            app.initForm(); //here the name of the function setting form values
        }
});

С этим событием все отлично работает в обоих случаях.

Чтобы предотвратить перезагрузку данных, когда ComboBox запускает новое событие load () после первого запуска, я проверяю, установлено ли значение в app.initForm ()

app.initForm = function () {
    var customerField = Ext.getCmp('formName').getForm().findField('idCustomer');
    if (customerField.getValue !== '') {
        return; //skipping init, form already filled
    }
    //Ajax Call here
};
0 голосов
/ 27 марта 2011

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

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);
}

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

0 голосов
/ 17 августа 2010
var partyType_store = new Ext.data.Store(
{
    autoLoad: false,
    autoDestroy: true,

    // Note that I have renamed the web service proxy class
    proxy: new Ext.data.HttpProxy({
        url: accounts.webService + '/GetType',
        // ASP.NET WebService call in GET format
        headers: {
            'Content-type': 'application/json'
        }
    }),

    fields: ['AccountTypeId', 'AccountTypeName'],
    listeners {
        load: function() {
            Ext.getCmp('cmbPartyType').setValue(Ext.getCmp("txtId").getValue());
            Ext.getCmp('cmbPartyType').fireEvent("select");
        }
    }
},

// Combo is defined as
{
    xtype: 'combo',
    width: 150,
    fieldLabel: 'Party Type',
    name: 'PartyType',
    id: 'accounts-cmbPartyType',
    store: partyType_store,
    displayField: 'PartyType',
    valueField: 'PartyTypeId',
    hiddenName: 'PartyTypeId',
    mode: 'local', // important property when using store
    typeAhead: true,
    triggerAction: 'all',
    selectOnFocus: true,
    allowBlank: true,
    forceSelection: true
}

Я загружаю комбинированный магазин по событию, скажем, событие нажатия кнопки

Ext.getCmp('cmbPartyType').getStore().load(); //this calls combo load event

Работает нормально, если я установил autoLoad = true в магазине Но на самом деле я не хочу загружать магазин изначально, чтобы уменьшить трафик, пока пользователь не нажмет кнопку

0 голосов
/ 17 августа 2010

Почему режим установлен на локальный вместо удаленного?Вы использовали FireBug, чтобы убедиться, что данные, отправляемые из службы ASP, правильно отформатированы?

Мне немного неясно, что вы ожидаете в хранилище для этих двух элементов:
valuefield: 'PartyTypeId '<- это номер или код?5? <br>displayField: 'PartyType' <- Это число или код?яблоко </p>

0 голосов
/ 16 августа 2010

Используете ли вы стандартный метод ExtJs setValue для установки значения в comboBox?

Убедитесь, что вы установили значение внутри Ext.onReady (...);

Или, если вы загружаете значения с помощью ajax, вы можете использовать метод обновления с обратным вызовом в качестве 3-го параметра (см. http://dev.sencha.com/deploy/dev/docs/ -> ComboBox)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...