【问题标题】:ExtJS 6 Use custom filter function within memory proxyExtJS 6 在内存代理中使用自定义过滤功能
【发布时间】:2017-11-21 03:22:33
【问题描述】:

我有一个配置了memory proxyenablePaging: 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;
});

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

【问题讨论】:

    标签: extjs extjs6


    【解决方案1】:

    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);
                }
    
            ...
    
            }
        }
    });
    

    【讨论】:

      【解决方案2】:

      您可以覆盖内存代理以满足您的需要,或者,如果您只想在searchFields 中指定的字段之一中找到一个字符串,您可以使用@987654321 向模型添加一个“虚拟”字段@方法指定。

      例如:

      // Extend Ext.data.Model or create it. Dealer's choice.
      Ext.define('MyLocalModel', {
          extend: 'Ext.data.model',
          fields: [
              ...
              {
                  name: 'searchField',
                  type: 'string',
                  convert: function(value, record) {
                      // Get search fields somewhere
                      var resultArray = [];
                      for (var i = 0; i < searchFields.length; ++i) {
                          var searchField = searchFields[i];
                          var fieldValue = record.get(searchField);
                          resultArray.push(fieldValue);
                      }
      
                      // Join by a string that would not normally be searched
                      // so that field values 'foo' and 'bar' are not valid when searching 'ooba'
                      var result = resultArray.join('**');
                      return result;
                  }
              }
          ]
      });
      

      你在商店里需要做的就是:

      store.filter('searchField', searchText);
      

      这不是您要搜索的内容,但应该可以完成工作。

      【讨论】:

      • 感谢您的想法,但我有很多数据,我认为将它加倍会影响性能(也许我错了,我会检查),所以我会尝试找到不同的解决方案。看起来我别无选择,只能覆盖代理并使用第二个商店。
      • 是的,这并不理想。对于较大部分的数据,我建议创建自定义代理。
      猜你喜欢
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 2011-08-14
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多