Kendo UI 按字段清除过滤器

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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");

【讨论】:

以上是关于Kendo UI 按字段清除过滤器的主要内容,如果未能解决你的问题,请参考以下文章

kendo ui 网格数据源过滤器日期格式

Kendo UI 默认网格过滤器值

Kendo UI - 属性更改 MVVM

为 Kendo UI Grid 设置默认过滤器

从 Kendo UI 网格过滤器和自动填充中获取价值

获取 Kendo UI Grid 中使用的过滤器