5

アプリケーションに kendo-grid があり、フィルター可能な "true" があります。フィルターを適用すると、グリッド アイテムがフィルターされ、グリッド サイズもリサイズされます。フィルタ列のテキストをクリアすると、クリア ボタンを押さなくても、ページロードで表示されるアイテムが自動的にグリッド表示されます。私のグリッドコードは

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");
4

2 に答える 2

16

グリッドのデータ ソースのフィルターメソッドを使用する必要があります。

$("#grid").data("kendoGrid").dataSource.filter([]);
于 2013-03-13T08:55:39.423 に答える
6

あなたが電話すれば

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" ) )

この方法は完全ではなく、いくつかテスト済みです。これが誰かに役立つことを願っています。

于 2015-01-27T18:17:36.380 に答える