【问题标题】:Clear the filtering with out clicking clear button无需单击清除按钮即可清除过滤
【发布时间】:2025-12-10 20:00:02
【问题描述】:

我的应用程序中有 kendo-grid。它具有可过滤的“真”。当我们应用过滤时,网格项目会被过滤,网格大小也会重新调整大小。当我们清除过滤器列中的文本然后自动网格显示页面加载中显示的项目而不按清除按钮。这可能吗?我的网格代码是

var grid = $("#grid").kendoGrid({
  dataSource: {
    type  : "odata",
    transport      : {
      read: "http://demos.kendoui.com/service/Northwind.svc/Orders"
    },
    schema         : {
      model: {
        fields: {
          OrderID  : { type: "number" },
          Freight  : { type: "number" },
          ShipName : { type: "string" },
          OrderDate: { type: "date" },
          ShipCity : { type: "string" }
        }
      }
    },
    pageSize       : 10
  },
  filterable: true,
  sortable  : true,
  pageable  : true,
  columns   : [
    {
    field     : "OrderID",
    filterable: false
  },
  "Freight",
  {
    field : "OrderDate",
    title : "Order Date",
    width : 100,
    format: "{0:MM/dd/yyyy}"
  },
  {
    field: "ShipName",
    title: "Ship Name",
    width: 200
  },
  {
    field: "ShipCity",
    title: "Ship City"
  }
  ]
}).data("kendoGrid");

【问题讨论】:

    标签: javascript kendo-ui


    【解决方案1】:

    需要使用网格数据源的filter方法:

    $("#grid").data("kendoGrid").dataSource.filter([]);
    

    【讨论】:

    • 感谢您的快速回复,我试过了,但没有得到任何结果。这是小提琴jsfiddle.net/SZBrt/17
    • 您的 jsfiddle 中存在 JavaScript 错误。这就是它不起作用的原因。
    • 您的过滤条件中的val 是什么?你想做什么?
    • 调试时出现错误,我的代码中没有小写方法,但为什么会出现此错误,“未捕获的 TypeError:对象 10248 没有方法 'toLowerCase'”我能知道哪里错了吗在代码中?
    • 我尝试在列过滤中过滤数据,第一次我们在列过滤器中输入值然后过滤数据,然后网格显示过滤数据,当我们单击清除按钮时网格显示实际数据,但我想在不点击清除按钮的情况下显示实际数据
    【解决方案2】:

    如果你打电话

    grid.dataSource.filter({})
    

    有一种可能,您会删除整个数据源过滤器,而不仅仅是网格中的字段。我的意思是 dataSource 可以出于某种原因进行预过滤。

    我开发了一种方法,它只删除网格的过滤器。

    kendo.ui.Grid.prototype.clearFilters = function(args){
        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)
                }
            }
        }
    
        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;
    }
    

    方法可以这样调用:

    $('#my-grid').data('kendoGrid').clearFilters({
        ignore: ['Field1', 'Field2']
    })
    

    存在递归是因为 dataSource 过滤器可能如下所示:

    {
        logic: "and"
        filters: [
            {
                logic: "or"     
                filters:[
                            {
                                field: "Field1"
                                operator: "contains"
                                value: "val1"
                            },
                            {
                                field: "Field1"
                                operator: "contains"
                                value: "val2"
                            }
                ],
            },
            {
                field: "Field3"
                operator: "contains"
                value: "val3"
            }
        ],
    }
    

    and 方法在所有嵌套的“过滤器”数组上递归调用。 上面的过滤器是这样的:

    ("Field3" === "val3" && ("Field1" === "val1" || "Field1" === "val2" ) )
    

    该方法并不完美,并且经过了一些测试。 我希望这对某人有所帮助。

    【讨论】: