あなたが電話すれば
grid.dataSource.filter({})
グリッド内のフィールドだけでなく、dataSource フィルター全体を消去する可能性があります。つまり、何らかの理由で 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);
}
そして、これが2番目の方法です。再帰的に呼び出すことができるため、分離されています。
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"
}
],
}
メソッドは、ネストされたすべての「フィルター」配列で再帰的に呼び出されます。上記のフィルターは次のようになります。
("Field3" === "val3" && ("Field1" === "val1" || "Field1" === "val2" ) )
この方法は完全ではなく、いくつかテスト済みです。これが誰かに役立つことを願っています。