Ext Js Combobox - синхронный вызов для установки значения - PullRequest
1 голос
/ 18 мая 2011

Разве мы не можем делать синхронные звонки с Ext.data.Store?

У меня есть модель, которую я загружаю в магазине. Позже я связываю это с комбобоксом. Этот поток работает отлично.

Но когда я хочу установить значение combo для выбора по умолчанию, я получаю сообщение об ошибке JS о том, что внутри магазина нет элементов. Причина в том, что ajax-вызов для заполнения хранилища выполняется после того, как весь JS выполнен. Я попытался сделать свойство async равным false, но все равно не повезло !!!

Вот мой фрагмент кода:

var store = new Ext.data.Store({        
    proxy: {
        type: 'ajax',
        url: '/GetAccounts',
        reader: {
            type: 'json'
        }
    },
    async: false,  //Tried this...no luck
    cache: false,
    autoLoad: true
});

var simpleCombo = Ext.create('Ext.form.field.ComboBox', {
    fieldLabel: 'For ',
    renderTo: 'simpleCombo',
    displayField: AccountName,
    valueField: 'AccountId',
    store: store,
    queryMode: 'local',
    forceSelection: true
});

simpleCombo.setValue(store.getAt(0).get('AccountId')); //JS ERROR AT THIS LINE. No elements in the store

Ответы [ 2 ]

2 голосов
/ 18 мая 2011

Отключить комбо, пока хранилище не заполнится. Не связывайтесь с запросом синхронизации, вы заморозите всю страницу (или даже браузер) до завершения запросов.

1 голос
/ 16 октября 2012

Я опубликовал нечто подобное на https://stackoverflow.com/a/12918140/1449525,, но я выбрал такой подход:

Добавьте слушателей в ваше поле со списком, чтобы, когда поле со списком фактически отображалось, оно пыталось установить его значение

listeners:{
    scope: this,
    afterRender: this.selectFirstComboItem
}

затем добавьте метод к вашему this (или где вы предпочитаете).

selectFirstComboItem: function(combo) {
    // This will tell us if the combo box has loaded at least once
    if (typeof combo.getStore().lastOptions !== "undefined") {
        // Grab the first value from the store
        combo.setValue(combo.getStore().first().get(combo.valueField));
    }
    else {
        // When the store loads
        combo.getStore().on("load", function(store, items){
            // Grab the first item of the newly loaded data
            combo.setValue(items[0].get(combo.valueField));
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...