EXTJS Combobox не выбирается по значению поля после раскрытия - PullRequest
5 голосов
/ 27 января 2009

Я написал некоторый код, который работает довольно хорошо, но у меня странная ошибка Вот пример ...


ПОЖАЛУЙСТА, СМОТРЕТЬ МОЕ ВИДЕО С ОШИБКАМ КОМБОБОКС


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

Странно то, что если я никогда не набираю текст и не изменяю выделение мышью, ошибки нет. Наконец, это появляется только тогда, когда я набираю текст в поле со списком.

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

Код!

Два хранилища данных :

ficheDataStore = new Ext.data.Store({
    id: 'ficheDataStore',
    autoLoad: true,
    proxy: new Ext.data.HttpProxy({
        url: 'ficheDetail.aspx',      // File to connect to
        method: 'GET'
    }),
    baseParams: { clientId: clientId, Type: 'Fiche' }, // this parameter asks for listing
    reader: new Ext.data.JsonReader({   // we tell the datastore where to get his data from
        root: 'results'
    }, [
        { name: 'GUID', type: 'string', mapping: 'GUID' },
        { name: 'TagClient', type: 'string', mapping: 'TagClient' },
        { name: 'Nom', type: 'string', mapping: 'Nom' },
        { name: 'Compteur', type: 'string', mapping: 'CompteurCommunes' },
        { name: 'CompteurCommunesFacturation', type: 'string', mapping: 'CompteurCommunesFacturation' },
        { name: 'AdresseFacturation', type: 'string', mapping: 'AdresseFacturation' },
        { name: 'Codes', type: 'string', mapping: 'Codes' },
        { name: 'Observations', type: 'string', mapping: 'Observations' },
        { name: 'Adresse', type: 'string', mapping: 'Adresse' }

      ])
});

 communesDataStore = new Ext.data.Store({
    autoLoad: true,
    proxy: new Ext.data.HttpProxy({ url: 'ficheDetail.aspx?Type=Communes' }),
    reader: new Ext.data.JsonReader({ root: 'results' }, [{ name: 'Compteur' }, { name: 'Localisation'}])
});

Кто вернет что-то подобное для первый:

  {results:[{"Nom":"cercle interieur"},{"Observations":""},{"Codes":" "},{"Adresse":"dd"},{"CompteurCommunes"
    :"1"},{"TagClient":"3-56"},{"GUID":"443609c6-d064-4676-a492-7baa7b4288d1"},{"AdresseFacturation":""}
    ,{"CompteurCommunesFacturation":"1"}]}

Для последнего:

{"results":[{ "Compteur" : "1","Localisation" : "6200  ST ISIDORE"},{ "Compteur" : "2","Localisation"
 : "21340 CHANGE"},{ "Compteur" : "3","Localisation" : "1200  ELOISE"},{ "Compteur" : "4","Localisation"
 : "1200  ST GERMAIN SUR RHONE"},{ "Compteur" : "5","Localisation" : "75000 PARIS"},{ "Compteur" : "6"
,"Localisation" : "75001 PARIS 1ER ARRONDISSEMENT"}]}

a Combobox:

 var comb = new Ext.form.ComboBox(
             {
               store: communesDataStore,
               fieldLabel: 'Code postal',
               // hiddenName: 'Compteur',
               name: 'CompteurCommune',
               id: 'CompteurCommunes',
               width: 300,
               typeAhead: true,
               mode: 'local',
               minChars: 0,
               selecOnFocus: true,
               forceSelection: true,
               valueField: 'Compteur',
               displayField: 'Localisation',
               autocomplete: true,
               emptyText: 'Selectionnez un code postal',
               triggerAction: 'all',
               value: ''
              });

в событии datachanged я установил новое значение Combobox "CompteurCommunes":

   ficheDataStore.addListener('datachanged', handleDatachangedEvent);

     function handleDatachangedEvent() 
       {
        try {
              comb.setValue(ficheDataStore.getAt(4).data.Compteur);                                                                                 
            }
        catch (err) { }
        }

Ответы [ 5 ]

3 голосов
/ 07 февраля 2009

Это, вероятно, потому, что когда вы вводите случайные данные в комбинированный список, он может не каждый раз находить правильное fieldValue. Затем застревает на последнем несуществующем значении.

Попробуйте установить ComboBox на любое существующее значение (в хранилище данных комбо) перед выполнением нового setValue () в вашем обработчике событий с измененной датой. Или вы можете попробовать использовать метод clearValue () для сброса предыдущего (неопределенного) valueField.

Существует также метод initList () для сброса комбо в исходное состояние.

РЕДАКТИРОВАТЬ: После некоторого тестирования я обнаружил, что: combo.store.clearFilter (); необходимо использовать перед setValue во внешнем обработчике событий.

1 голос
/ 21 апреля 2010
function formatComboBox(value, metaData, record, rowIndex, colIndex, store) {
        myStore = Ext.getCmp('myComboBox');
        myStore.clearFilter();
        var idx = myStore.find('value',value);
        return (idx != '-1') ? myStore.getAt(idx).data.label : value;
}
0 голосов
/ 24 июня 2011

В случае, если кто-нибудь - как я - зайдет сюда через Google, потому что это наиболее похоже на их проблему ComboBox ft. SetValue ():

После часа входа и выхода из внутренних частей Ext я обнаружил, что мне нужно установить lazyInit: false для полей со списком. По умолчанию он имеет значение true, а если он истинный, это может вызвать нелогичное поведение, если вы не знаете об этом. И с чего бы ты? Все остальное, по-видимому, не ленивое по умолчанию.

0 голосов
/ 07 февраля 2009

Вы можете взглянуть на параметры hiddenName и hiddenId в Ext.form.ComboBox. Если вы установите значение скрытого поля формы, связанного с выпадающим списком, то выпадающий список отобразит метку этого значения вместо самого значения.

Это полезно, когда вам нужно установить значение на конце сервера и направить пользователя на страницу.

Еще один полезный метод - selectByValue. Этот метод выбрал бы элемент, значение которого равно переданному аргументу.

В вашем dataChangedListener вместо установки значения combobox, вы должны установить значение скрытого поля формы, связанного с ComboBox. Также после установки значения скрытого поля вам может понадобиться запустить метод selectByValue.

Вы можете взглянуть на Документацию по ExtJS API для дальнейшего ознакомления.

0 голосов
/ 06 февраля 2009

Во-первых, выпадающий список Ext JS должен автоматически применить значение и отобразить его при выборе элемента, за исключением того, что вы назначили магазин и сказали Ext, что поле требует значения.

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

Какова основная причина того, почему вы пытаетесь установить это значение для ComboBox?

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