ExtJS 6 在内存代理中使用自定义过滤器功能

标签 extjs extjs6

我有一个配置了 memory proxy 的商店使用 enablePaging: true。 Store 的 remoteFilterremoteSort 设置为 true,因此过滤和排序请求由代理处理。

当我按多个字段过滤我的商店时,我想使用 OR 条件,而不是 AND。

如果没有内存代理分页,我可以使用 remoteFilter: false 和自定义过滤器函数,例如:

store.filterBy(function (record)
{
    for (var i = 0; i < searchFields.length; ++i) {
        if (record.get(searchFields[i]).toLowerCase().indexOf(searchText) !== -1) {
            return true;
        }
    }
    return false;
});

但是如何通过启用的分页实现这一点呢?覆盖内存代理?

最佳答案

Ext.data.proxy.Memory.read使用 Ext.util.Filter.createFilterFn根据传递的 Ext.util.Filter[](具有属性值配置)创建过滤器函数:

// Filter the resulting array of records 
if (filters && filters.length) {
    // Total will be updated by setting records 
    resultSet.setRecords(records = Ext.Array.filter(records, Ext.util.Filter.createFilterFn(filters)));
    resultSet.setTotal(records.length);
}

所以,如果你想使用不同的过滤逻辑,你可以重写memroy代理读取方法并使用自定义函数来创建过滤函数:

Ext.define('MyApp.extensions.FilterMemoryProxy', {
    extend: 'Ext.data.proxy.Memory',
    alias: 'proxy.filtermemory',

    createCustomFilterFn: function (filters)
    {
        if (!filters) {
            return Ext.returnTrue;
        }
        return function (candidate)
        {
            var items = filters.isCollection ? filters.items : filters,
                length = items.length,
                i, filter;
            for (i = 0; i < length; i++) {
                filter = items[i];
                if (!filter.getDisabled() && candidate.get(filter.getProperty()).toLowerCase().indexOf(
                        filter.getValue().toLowerCase()) !== -1) {
                    return true;
                }
            }
            return false;
        };
    },

    read: function (operation)
    {

        ...

        if (operation.process(resultSet, null, null, false) !== false) {
            // Filter the resulting array of records
            if (filters && filters.length) {
                // Total will be updated by setting records
                resultSet.setRecords(records = Ext.Array.filter(records, me.createCustomFilterFn(filters)));
                resultSet.setTotal(records.length);
            }

        ...

        }
    }
});

关于ExtJS 6 在内存代理中使用自定义过滤器功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44621597/

相关文章:

javascript - ExtJS改变标签值

javascript - Sencha Ext.define 使用与要求

javascript - 如何在 ExtJS 存储代理中更改 extraParams 的分隔符?

javascript - 更新 ExtJS 6 图表中的图例颜色

javascript - 网格中的默认值

javascript - 添加按键映射

javascript - Extjs 6 中带有 html 编码显示字段的 Tagfield

ExtJS 6 plugin.rowwidget 在网格调整大小时调整行主体组件的大小

extjs - 如何在 ExtJS 的绑定(bind)公式中使用逻辑运算符?

javascript - 在 Sencha ExtJs 6.0 中制作 TreeView