2012-04-20 3 views
2

Я вижу проблему с combobox, где у меня есть слушатель для события «change». Когда событие срабатывает, он запускает функцию, которая фильтрует хранилище, которое активирует другое поле со списком, чтобы фильтровать значения, доступные во втором поле со списком.ExtJS4 combobox loading/store issue

Идея состоит в том, что, когда вы выбираете из короткого списка в первом поле со списком, оно раскрывает варианты во втором поле со списком.

Когда форма загружается, вы можете щелкнуть второе поле со списком и увидеть все варианты, которые отлично работают. Когда вы затем выбираете что-то в первом поле со списком, а затем снова выбираете второй выпадающий список, вы видите соответствующий сокращенный список, но он неактивен, а «загрузка ...» просто вращается и никогда не исчезнет.

Если вы загружаете форму и выбираете что-то в первом поле со списком, а затем выбираете второе поле со списком, оно будет фильтровать и отображать в порядке, но вы столкнулись с проблемой проблемы загрузки, описанной выше, если вы попытаетесь изменить свой выбор в первый квадрат и снова щелкните вторую выпадающую ячейку.

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

У меня есть внутр магазин создан как следующее:

var comboBreaker = Ext.create('Ext.data.Store', { 
    autoLoad: false, 
    remoteSort: true, 
    remoteFilter: true, 
    fields: [{ 
     name: 'id', 
     mapping: 'item_id', 
     type: 'int', 
     useNull: false}, 
     'item_display_number','item_name', 'line_item_type_id', 'item_description' 
    ], 
    proxy:{ 
     type:'ajax', 
     url: '/invoicer/data/getlineitems', 
     reader: { 
      type: 'json', 
      successProperty: 'success', 
      root: 'results', 
      totalProperty: 'totalCount' 
     }, 
     sorters:[{ 
      property:'item_display_number', 
      direction:'ASC' 
     }] 
    } 
}); 

Этот магазин полномочия выпадающий, например, так:

Ext.define('Writer.Form', { 
    extend: 'Ext.form.Panel', 
    alias: 'widget.writerform', 

    requires: ['Ext.form.field.Text'], 

    initComponent: function(){ 
     this.addEvents('create'); 
     Ext.apply(this, { 
      activeRecord: null, 
      frame: true, 
      title: 'Line Item', 
      id: 'writerform', 
      fieldDefaults: { 
       anchor: '100%', 
       labelAlign: 'right' 
      }, 
      items: [{ 
       xtype: 'combobox', 
       fieldLabel: 'Item #', 
       name: 'item_number', 
       store: comboBreaker, 
       displayField: 'item_display_number', 
       valueField: 'id', 
       allowBlank: false, 
       forceSelection: true 
      },{ 
       xtype: 'combobox', 
       fieldLabel: 'Item Type', 
       name: 'item_type', 
       id: 'item_type', 
       displayField: 'line_item_type', 
       valueField: 'id', 
       store: invoicer_lineItemTypeStore, 
       forceSelection: true, 
       labelWidth: 75, 
       width: 200, 
       listeners: { 
        change: { 
         fn: function() { 
          itemNumberFilter(comboBreaker); 
         } 
        } 
       } 
      }] 
}); 

Функция itemNumberFilter() принимает в магазин и делает фильтрацию на этом, вот что такое код:

function itemNumberFilter(store) { 
    var id = Ext.getCmp('item_type').getValue(); 
    store.remoteFilter = false; 
    store.clearFilter(); 
    if (id) { 

     store.filter('line_item_type_id', id); 
    } 
    store.remoteFilter = true; 
    store.removeAll(); 
    store.load({ 
     scope: this, 
     callback: function(records) { 
      console.log('Loaded records!'); 
      console.log(records); 
     } 
    }); 
} 

Я вижу зарегистрированные записи каждый раз, когда меняю m y в первом поле со списком, и я могу «видеть» результаты во втором поле со списком, но они всегда отображаются серым цветом с показанием «loading ..» GIF.

Edit: Видео пример: http://screencast.com/t/cUSHyFE6FIV

Edit: Я считаю, что это решение:

lastQuery: '', 
listeners: { 
         beforequery: { 
          fn: function(query) { 
           delete this.lastQuery; 
          } 
         } 
        } 

Добавление этого в выпадающем списке конфигурации устраняет проблему.

Edit2: Я побежал во вторую ошибку, введенной этим, было зафиксировано, добавив:

this.clearValue(); 

к функции beforequery (выше удалить this.lastQuery). Это очищает значение выпадающего списка при каждом нажатии стрелки вниз.

+1

Я испытал точно такую ​​же проблему и исправил ее, вызвав 'store.fireEvent ('load', ...)' в 'store.load()' обратный вызов. Ваше решение намного лучше. Thanx! – ischenkodv

ответ

0

Предположим, вы выбрали пункт x в combo_1, а затем товар a в нижнем списке в combo_2. Затем вы меняете выбор в combo_1 на y, который затем меняет список элементов в combo_2. Есть a в новом списке в combo_2, что является результатом выбора пункта y в combo_1? Возможно, проблема заключается в попытке сохранить выбранный элемент, когда он больше не существует в списке, доступном для комбо.

Вы попробовали очистить выбор в combo_2 перед применением фильтра?

+0

Я записал здесь видео, которое, я думаю, помогает объяснить. http://screencast.com/t/cUSHyFE6FIV Посмотрите, как при изменении поля 2 с позиции «Позиция» на «Налоговый» элементы в поле 1 изменится, но диалог загрузки не исчезнет? –

+0

Думаю, я решил. См. Оригинальное сообщение. –

0

Вы можете динамически загружать хранилище второго блока combox, но обязательно установите для второго блока combox значение «local».

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