【问题标题】:Kendo UI clear filter by fieldKendo UI 按字段清除过滤器
【发布时间】:2014-08-23 10:22:59
【问题描述】:

我的页面上有剑道网格。这个网格有数据源。在这个数据源中,我有一系列复杂的过滤器。例如:

http://s7.postimg.org/bmqxgp2ff/filters.png

在向数据源过滤器添加一组新过滤器之前,我需要删除所有过滤器,例如 field="fld_32"。

我认为可以通过递归来做到这一点,但在网格上有一个具有“清除”按钮的过滤器组件,并且按钮清除执行我需要的相同操作。但我不知道它是如何工作的以及如何以编程方式调用它。

【问题讨论】:

    标签: javascript kendo-ui grid datasource


    【解决方案1】:

    我通过擦除网格中所有过滤器的方法扩展了 kendoGrid:

    kendo.ui.Grid.prototype.clearFilters = function(args){
    // MODIFY THIS PART
        var ignore = [];
        // test arguments
        if(typeof args === 'object'){
            if(args.hasOwnProperty('ignore')){
                if(args.ignore.length > 0){
                    ignore = args.ignore;
                }
            }
        }
    
    // get dataSource of grid and columns of grid
    var fields = [], filter = this.dataSource.filter(), col = this.columns;
    if( $.isEmptyObject(filter) || $.isEmptyObject(filter)) return;
    
    // Create array of Fields to remove from filter and apply ignore fields if exist
    for(var i = 0, l = col.length; i < l; i++){
        if(col[i].hasOwnProperty('field')){
            if(ignore.indexOf(col[i].field) === -1){
                fields.push(col[i].field)
            }
        }
    }
    // MODIFY THIS PART END
    
    if($.isEmptyObject(fields)) return;
    
    // call "private" method
    var newFilter = this._eraseFiltersField(fields, filter)
    
    // set new filter
    this.dataSource.filter(newFilter);
    }
    

    这是第二种方法。之所以分开是因为可以递归调用:

    kendo.ui.Grid.prototype._eraseFiltersField = function(fields, filter){
        for (var i = 0; i < filter.filters.length; i++) {
        // For combination 'and' and 'or', kendo use nested filters so here is recursion
        if(filter.filters[i].hasOwnProperty('filters')){
            filter.filters[i] = this._eraseFiltersField(fields, filter.filters[i]);
            if($.isEmptyObject(filter.filters[i])){
                filter.filters.splice(i, 1);
                i--;
                continue;
            }
        }
    
        // Remove filters
        if(filter.filters[i].hasOwnProperty('field')){
            if( fields.indexOf(filter.filters[i].field) > -1){
                filter.filters.splice(i, 1);
                i--;
                continue;
            }
        }
    }
    
    if(filter.filters.length === 0){
        filter = {};
    }
    
    return filter;
    }
    

    对于您的问题,您可以修改 clearFilters 方法以将要从过滤器(“fld_32”)中删除的字段的名称作为参数。然后可以将该字段插入到_eraseFiltersField 参数而不是网格的字段中。

    【讨论】:

      【解决方案2】:

      您需要做的就是使用此功能。这将清除所有过滤器:

      function clearFiter() {
          $("form.k-filter-menu button[type='reset']").trigger("click");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-18
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多