在两个差异列上筛选网格存储

Filter store of grid on two differents columns

本文关键字:筛选 网格 存储 两个      更新时间:2023-09-26

我试图在两列上筛选存储,一列带有数组,另一列带有单词开头(它将是and,而不是OR)。所以我知道如何用数组过滤商店:

 grid.store.load().filterBy(function(record, id){
                return Ext.Array.indexOf(filter, record.get("type")) !== -1;
            }, this);

我知道如何用单词开头过滤商店:

 {id: 'name', property: "name", value: newValue, anyMatch: true}

但我不知道如何将两者结合起来。

我试过了:

        grid.store.load().filterBy(function(record, id){
            if(Ext.Array.indexOf(filter, record.get("type")) !== -1 && record.get("name").indexOf(newValue) !== -1){
                return record;
            }
        }, this);

但当我只想匹配它时,它会给我完整的单词。我该怎么做才能抓住单词的一部分?

每次过滤时都可以创建新的过滤器来过滤模型多个字段上的存储。可以通过将anyMatch设置为true或使用regex来过滤部分单词。

对一列(模型的一个字段)进行筛选

这里我创建了一个使用anyMatch过滤网格列的示例。

https://fiddle.sencha.com/#fiddle/ts4

列上方文本字段(示例应用程序中的FilterField)的部分代码:

keyup: {
    fn: function(field, event, eOpts) {
        var grid = this.up('grid'),
            /* only filter when value is empty and key is backspace or delete */
            isValidKey = ((event.keyCode === Ext.event.Event.BACKSPACE || event.keyCode === Ext.event.Event.DELETE) || !event.isSpecialKey());
        if(isValidKey === true) {
            grid.getStore().filter(new Ext.util.Filter({
                anyMatch: true,
                disableOnEmpty: true,
                property: field.up('gridcolumn').dataIndex,
                value   : field.getValue()
            }));
            grid.getSelectionModel().select(0);
        }
    },
    buffer: 250
}

筛选所有列(模型的所有文件)

这里我创建了一个示例,它使用regex过滤网格的所有列。

https://fiddle.sencha.com/#fiddle/un7

控制器(主控制器)的部分代码:

filterStore: function(searchValue) {
    var me = this,
        grid = me.getMainGrid(),
        store = grid.getStore(),
        regex = RegExp(searchValue, 'i');
    store.clearFilter(true);
    store.filter(new Ext.util.Filter({
        filterFn: function(record) {
            var match = false;
            Ext.Object.each(record.data, function(property, value) {
                match = match || regex.test(String(value));
            });
            return match;
        }
    }));
}

我用正则表达式解决了这个问题。如果有人想用一个数组和一个值过滤2列的网格,下面是你的方法:

grid.store.load().filterBy(function(record, id){
                var re = new RegExp("/(^"+newValue+" )", 'i');
                if(Ext.Array.indexOf(filter, record.get("type")) !== -1 && record.get("name").match(re) !== -1){
                    debugger;
                    return record;
                }
            }, this);