如何在 ExtJS6 中使用本地(内存)存储将过滤器功能应用于分页网格?

亚历克斯Ps801012

我有一个带有本地商店的分页网格,我想使用我自己的函数应用过滤器。但它失败了。

从我使用的互联网推荐remoteFilter: trueenablePaging: true商店配置中的选项。

如果我使用特定的配置对象过滤存储,它会完美地工作:

store.filter([{ property: 'age', value: 12 }]);

不幸的是,建立复杂的过滤条件是不够的。

根据文档filterBy,store 对象中有一种特殊方法可以将函数用作过滤器。但是,当我像这样提供它时:

store.filterBy( function( record ) {
  return record.get( 'age' ) <= 12;
});

我有一个错误 Uncaught Error: Unable to use a filtering function in conjunction with remote filtering.

这是我在小提琴https://fiddle.sencha.com/#fiddle/2u8l 中的工作示例

这是我的商店配置和控制器的所有业务逻辑。我将在这里跳过视图配置以专注于代码的主要部分(IMO)

Ext.define('TestGridViewModelr', {
    extend: 'Ext.app.ViewModel',

    alias: 'viewmodel.myexmpl.main.testgrid',

    data: {
    },
    formulas: {},
    stores: {
        simpsons: {
            model: 'Ext.data.Model',// 'SimpsonModel',
            pageSize: 2,
            // remoteSort: true,
            remoteFilter: true,
            proxy: {
                type: 'memory',
                enablePaging: true,
                reader: {
                    type: 'json',
                    rootProperty: 'items'
                }
            }
        }
    }

});

Ext.define('TestGridController', {
    extend: 'Ext.app.ViewController',

    alias: 'controller.myexmpl.main.testgrid',

    init: function () {
        console.log('controller inititalized\n  init async store loading...');
        setTimeout( this.onStoreLoad.bind( this ), 1000 );
    },

    initViewModel: function(vm){
        console.log( 'viewModel init', vm.get('test') );
    },
    emptyMethod: function () {},

    onStoreLoad: function () {
        console.log('loading store');
        var vm = this.getViewModel();
        var store = vm.getStore('simpsons');
        store.getProxy().data = this.getSimpsonsData().items;
        store.reload();
        // store.loadData( this.getSimpsonsData() );
    },

   //++++++++++++  FILTERING  ++++++++
    /* NO PROBLEM */
    onToggleFilter: function () {
        console.log('simple filter');
        var filter = this.getSimpleFilter()
        this.toggleFilter( filter );
    },
    /* PROBLEM */
    onToggleFnFilter: function(){
       console.log('function filter');
    //   var filterFn = this.filterChildren;
       var filterFn = this.getFilterUtil()
       this.toggleFilter( filterFn );
    },

    /* NO PROBLEM */
    getSimpleFilter: function(){
        return {
            property: 'age',
            value: '12'
        };
    },

    /* PROBLEM */
    getFilterUtil: function() {
        return Ext.create( 'Ext.util.Filter', {
            filterFn: this.filterChildren
        })
    },

    filterChildren: function( record ) {
        var age = record.get( 'age' );
        console.log( 'filter record up to age:', age )// debugger;
        return parseInt( age ) <= 12;
    },

    toggleFilter: function( fltr ) {
        var store = this.getViewModel().getStore( 'simpsons' );
        var filters = store.getFilters();
        if ( filters.length > 0 ) {
            store.clearFilter();
        } else {
           this. applyFilterToStore( fltr, store );
        }
    },

    applyFilterToStore: function( filter, store ){
        var method = Ext.isFunction( filter ) || filter instanceof Ext.util.Filter
            ? 'filterBy'
            : 'setFilters';
        store[method]( filter );
    },



    getSimpsonsData: function(){
        return  {
            'items': [{
                'name': 'Lisa',
                'age': 12,
                "email": "[email protected]",
                "phone": "555-111-1224"
            }, {
                'name': 'Bart',
                'age': 8,
                "email": "[email protected]",
                "phone": "555-222-1234"
            }, {
                'name': 'Homer',
                'age': 40,
                "email": "[email protected]",
                "phone": "555-222-1244"
            }, {
                'name': 'Marge',
                'age': 34,
                "email": "[email protected]",
                "phone": "555-222-1254"
            }]
        }
    }
});



一般来说,我希望能够以编程方式在具有本地存储的分页网格上设置过滤条件。函数允许我使用连接和讨论来扩展过滤器功能并构建灵活的逻辑表达式。例如:

name.lenght <= 4 &&  ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)

提前谢谢你,A。

亚历克斯Ps801012

我终于解决了这个问题!

在下一行的 store 的 onFilterEndUpdate 方法中提到的错误:

...
me.getFilters().each(function(filter) {
  if (filter.getInitialConfig().filterFn) {
    Ext.raise('Unable to use a filtering function in conjunction with remote filtering.');
  }
});
...

我在我的商店实体中覆盖了这个方法并注释掉了这些行。我知道这不是最好的解决方案,但我找不到更好的解决方案。

这是有关此主题的完整解决方案:

  1. 使用remoteFilter: trueenablePaging: true选项配置商店
{
 model: 'Ext.data.Model',
 pageSize: 2,
 remoteFilter: true,
 proxy: {
   type: 'memory',
   enablePaging: true,
   reader: {
     type: 'json'
   }
 }
}
  1. 使用它的Proxy代替loadData方法将数据加载到存储
store.getProxy().data = this.getSimpsonsData().items;
store.reload();
  1. 在商店初始化后覆盖方法 onFilterEndUpdate 并注释掉提到的行,即:
onStoreLoad: function() {
...
  store.onFilterEndUpdate = this.onFilterEndUpdate.bind( store );
...
},

onFilterEndUpdate: function() {
  var me = this
    , suppressNext = me.suppressNextFilter
    , filters = me.getFilters(false);
  // If the collection is not instantiated yet, it's because we are constructing.
  if (!filters) {
    return;
  }
  if (me.getRemoteFilter()) {
    // me.getFilters().each(function(filter) {
    //      if (filter.getInitialConfig().filterFn) {
    //          Ext.raise('Unable to use a filtering function in conjunction with remote filtering.');
    //      }
    // });
    me.currentPage = 1;
    if (!suppressNext) {
      me.load();
    }
  } else if (!suppressNext) {
    me.fireEvent('datachanged', me);
    me.fireEvent('refresh', me);
  }
  if (me.trackStateChanges) {
    // We just mutated the filter collection so let's save stateful filters from this point forward.
    me.saveStatefulFilters = true;
  }
  // This is not affected by suppressEvent.
  me.fireEvent('filterchange', me, me.getFilters().getRange());
}

这是小提琴的现场示例https://fiddle.sencha.com/#fiddle/2ub7

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

网格之间的Extjs6关联

来自分类Dev

Extjs6 Sort Grid 过滤器列表项

来自分类Dev

如何扩展ExtJS6中焦点的组合框?

来自分类Dev

从 DB extjs6 动态设置网格 ID

来自分类Dev

Sencha cmd构建在使用EXTJS6时失败

来自分类Dev

如何在extjs6的文本表单字段中添加工具提示

来自分类Dev

ExtJS6:如何在标签面板项上添加关闭图标

来自分类Dev

如何将过滤器应用于 {%...%}?

来自分类Dev

如何在KonvaJS中将过滤器应用于具有图像填充的形状?

来自分类Dev

如何在AngularJS中将过滤器应用于特定属性?

来自分类Dev

如何将过滤器应用于 ag 网格中的单元格渲染器

来自分类Dev

Extjs6通过功能从配置中应用属性

来自分类Dev

根据extjs6中网格值中的值自动调整网格列的大小

来自分类Dev

extjs6 - 网格上下文菜单,通过行选择

来自分类Dev

在网格和编辑窗口的组合框中显示条目值。Extjs6

来自分类Dev

在extjs6应用程序构建中添加自定义文件

来自分类Dev

如何在Extjs 4.2中的网格的单列上应用多个过滤器

来自分类Dev

如何将过滤器应用于具有多个“ AND”条件的DataView

来自分类Dev

将过滤器应用于Scala Map时,如何查看已删除的条目?

来自分类Dev

如何将过滤器号应用于输入值 AngularJS

来自分类Dev

如何转换此数据框并将过滤器应用于单元格?

来自分类Dev

如何将过滤器应用于具有多个“ AND”条件的DataView

来自分类Dev

JPA如何将过滤器应用于EJB条件查询

来自分类Dev

将过滤器应用于Scala Map时,如何检查已删除的条目?

来自分类Dev

如何将过滤器号应用于输入值 AngularJS

来自分类Dev

将过滤器应用于Cocoa中的NSArrayController后,如何从NSArray获取值

来自分类Dev

如何将过滤器应用于 SQL SERVER 中的一组记录

来自分类Dev

ExtJS6扩展组件

来自分类Dev

如何过滤EXTJS网格列表过滤器?

Related 相关文章

  1. 1

    网格之间的Extjs6关联

  2. 2

    Extjs6 Sort Grid 过滤器列表项

  3. 3

    如何扩展ExtJS6中焦点的组合框?

  4. 4

    从 DB extjs6 动态设置网格 ID

  5. 5

    Sencha cmd构建在使用EXTJS6时失败

  6. 6

    如何在extjs6的文本表单字段中添加工具提示

  7. 7

    ExtJS6:如何在标签面板项上添加关闭图标

  8. 8

    如何将过滤器应用于 {%...%}?

  9. 9

    如何在KonvaJS中将过滤器应用于具有图像填充的形状?

  10. 10

    如何在AngularJS中将过滤器应用于特定属性?

  11. 11

    如何将过滤器应用于 ag 网格中的单元格渲染器

  12. 12

    Extjs6通过功能从配置中应用属性

  13. 13

    根据extjs6中网格值中的值自动调整网格列的大小

  14. 14

    extjs6 - 网格上下文菜单,通过行选择

  15. 15

    在网格和编辑窗口的组合框中显示条目值。Extjs6

  16. 16

    在extjs6应用程序构建中添加自定义文件

  17. 17

    如何在Extjs 4.2中的网格的单列上应用多个过滤器

  18. 18

    如何将过滤器应用于具有多个“ AND”条件的DataView

  19. 19

    将过滤器应用于Scala Map时,如何查看已删除的条目?

  20. 20

    如何将过滤器号应用于输入值 AngularJS

  21. 21

    如何转换此数据框并将过滤器应用于单元格?

  22. 22

    如何将过滤器应用于具有多个“ AND”条件的DataView

  23. 23

    JPA如何将过滤器应用于EJB条件查询

  24. 24

    将过滤器应用于Scala Map时,如何检查已删除的条目?

  25. 25

    如何将过滤器号应用于输入值 AngularJS

  26. 26

    将过滤器应用于Cocoa中的NSArrayController后,如何从NSArray获取值

  27. 27

    如何将过滤器应用于 SQL SERVER 中的一组记录

  28. 28

    ExtJS6扩展组件

  29. 29

    如何过滤EXTJS网格列表过滤器?

热门标签

归档