Ext JS:过滤组合框的正确技术?

时间:2011-09-07 11:38:43

标签: javascript extjs combobox store

当我通过向底层商店添加过滤器来过滤组合框时,有时过滤器有效(项目被删除),有时它没有效果。我调试了filterBy函数;它被调用并返回true / false,因为我希望过滤/显示项目。

我在ExtJS论坛上看到,“Combobox使用过滤(即使使用triggerAction:'all'),所以你自己的触发器会被组合框中的触发器取代。”两个过滤器?

在Ext JS组合框中删除临时项目的正确方法是什么?

4 个答案:

答案 0 :(得分:5)

使用lastQuery:''在配置中。

我遇到了类似的问题,无论过滤器是什么,组合框都会在第一次点击触发器时显示所有项目。

要确保在第一次使用ComboBox触发器时未清除商店中的过滤器,请使用lastQuery =''配置组合。 http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.form.field.ComboBox-property-lastQuery

答案 1 :(得分:3)

你想了解如何重现triggerAction的行为:'all',那么为什么不深入研究代码?

这里是Class 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)我们可以看到Store的方法过滤器被调用。 你有答案,正确的技术是删除ExtJS组合框中的临时项目(通常在商店中),正在使用商店中的方法过滤器。

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

记住,你最好的朋友总是记录在案! http://docs.sencha.com/ext-js/4-0/#

答案 2 :(得分:1)

你需要删除Combobox的属性'lastQuery', 每次过滤商店时。这是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);
                }
            }
        }

它对我很有用: - )

答案 3 :(得分:0)

请注意,过滤不会使用新数据“重新创建”商店,例如,如果您使用"apple"的以下值过滤了组合:

orange
banana
apple

点击触发器,会显示“apple”。但是,如果您开始输入(并且typeAhead: true处于有效状态,则根据您的输入进行的过滤将默认返回orange/banana/apple商店。