Ext JS: правильная техника для фильтрации комбобокс? - PullRequest
1 голос
/ 07 сентября 2011

Когда я фильтрую комбинированный список, добавляя фильтр в базовое хранилище, иногда фильтр работает (элементы удаляются), а иногда он не имеет никакого эффекта.Я отладил функцию filterBy;он вызывается и возвращает true / false, так как я хочу фильтровать / показывать элементы.

Я читал на форумах ExtJS, что «Combobox использует фильтрацию (даже с triggerAction:« all »), так что вашсобственный триггер заменяется на триггер ".Два фильтра?

Какая правильная техника для временного удаления элементов в выпадающем списке Ext JS?

Ответы [ 4 ]

5 голосов
/ 08 февраля 2015

Использовать lastQuery: '' в конфигурации.

Я столкнулся с похожей проблемой, когда в комбинированном окне будут отображаться все элементы при первом нажатии на триггер, независимо от фильтра.

Чтобы убедиться, что фильтр в хранилище не очищается при первом использовании триггера ComboBox, настройте комбо со значением lastQuery = '' http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.form.field.ComboBox-property-lastQuery

4 голосов
/ 07 сентября 2011

Вы хотите понять, как воспроизвести поведение triggerAction: 'all', так почему бы не погрузиться в код?

Вот исходный код класса ComboBox: http://docs.sencha.com/ext-js/4-0/source/ComboBox.html#Ext-form-field-ComboBox-cfg-triggerAction

Если вы посмотрите на код, то увидите, что:

1) При нажатии на триггер вызывается метод doQuery.

onTriggerClick: function() {
    var me = this;
    if (!me.readOnly && !me.disabled) {
        if (me.isExpanded) {
            me.collapse();
        } else {
            me.onFocus({});
            if (me.triggerAction === 'all') {
                me.doQuery(me.allQuery, true);
            } else {
                me.doQuery(me.getRawValue(), false, true);
            }
        }
        me.inputEl.focus();
    }
},

2) В методе doQuery интересный фрагменткода:

if (isLocalMode) {
    // forceAll means no filtering - show whole dataset.
    if (forceAll) {
        store.clearFilter();
    } else {
        // Clear filter, but supress event so that the BoundList is not immediately updated.
        store.clearFilter(true);
        store.filter(me.displayField, queryString);
    }
}

3) Мы видим, что вызывается метод фильтра Магазина.У вас есть ответ, правильная техника для временного удаления элементов в выпадающем списке ExtJS (как правило, в магазине) использует фильтр методов в магазине.

http://docs.sencha.com/ext-js/4-0/#!/api/Ext.data.Store-method-filter

Помните, вашлучший друг всегда документация!http://docs.sencha.com/ext-js/4-0/#

1 голос
/ 29 мая 2012

Вам нужно будет удалить свойство lastQuery в Combobox каждый раз, когда вы фильтруете Магазин.Вот где ComboBox кеширует свой Entryset после того, как собрал его в первый раз.

Делая что-то вроде этого:

      'window combobox[name=countryselection]' : {
            'change' : function(view, newValue){
                with(Ext.data.StoreManager.lookup('Subcountries')){
                    var combobox = Ext.getCmp('MainWindow').query('combobox[name=subcountryselection]')[0];
                    //force the combobox the rebuild its entryset
                    delete combobox.lastQuery;
                    clearFilter();
                    filter('countryId', newValue);
                }
            }
        }

Это прекрасно работает для меня: -)

0 голосов
/ 09 сентября 2011

Имейте в виду, что фильтрация не "воссоздает" хранилище с новыми данными, так что если вы отфильтровали комбо со следующими значениями для "apple":

orange
banana
apple

И вы нажали на курок, «яблоко» будет показано. Однако, если вы начали печатать (и у вас активен typeAhead: true, фильтрация по вашему вводу по умолчанию вернется к orange/banana/apple Store.

...