2015-04-02 30 views
1

我有一个Kendo Grid,我只想在其第一次加载时使用自定义过滤器。我从远程数据源拉,所以我想我会绑定到dataBinding事件,操纵数据源添加一个过滤器,并发送它的方式。在远程数据源调用之前将过滤器注入数据源

我可能是错误的,但我的理解是,dataBinding是一个事件,引发前数据源读取,这就是为什么我想注入我的过滤器。

[更新#1:]
我使用剑道的ASP.NET MVC的包装生产,但我想要做的通过Javascript过滤,因为这是我如何得到我的myCustomGridFilters阵列。我有一个我创建的JS网格扩展类,它包含额外的网格特征。这已经为我的所有网格实例化,所以我不想手动进入每个网格MVC包装的初始化并添加过滤器。

供参考,这是我的数据源建设者我的ASP.NET MVC代码:

// remainder of Kendo Grid wrapper 
.DataSource(dataSource => dataSource 
    .Ajax() 
    .PageSize(ViewUtilities.GetDefaultGridSettings().DefaultPageSize) 
    .Read(read => read.Action("ListThreatsOverview", "Threats")) 
    .ServerOperation(true) 
    .Sort(sort => sort.Add("ActiveInDevices").Descending()) 
    .Model(model => 
    { 
     model.Id(u => u.Id); 
     model.Field(u => u.FileHashId).Editable(false); 
     model.Field(u => u.CommonName).Editable(false); 
     model.Field(u => u.ActiveInDevices).Editable(false); 
     model.Field(u => u.BlockedInDevices).Editable(false); 
     model.Field(u => u.SuspiciousInDevices).Editable(false); 
    }) 
) 

我创建了一个的jsfiddle效仿我的方案。我知道这是不是我的代码的翻版,但它是我的情况的翻版:

这里是我的applyCustomFilter() js的方法我申请到dataBinding事件:

function applyCustomFilter (dataSource) { 
    // find custom filters 
    var customFilters = myCustomGridFilters.length ? myCustomGridFilters : []; 

    // if no custom filters, return 
    if (customFilters.length === 0) return; 

    // apply custom filter 
    // get currently applied filters from the Grid. 
    var currFilterObj = dataSource.filter(); 

    // get current set of filters, which is supposed to be array. 
    // if the oject we obtained above is null/undefined, set this to an empty array 
    var currentFilters = currFilterObj ? currFilterObj.filters : []; 

    // loop over custom filters 
    for (var i = 0; i < customFilters.length; i++) { 
     var filterField = customFilters[i].field; 
     var filterValue = customFilters[i].value; 
     var filterOperator = customFilters[i].operator; 

     // iterate over current filters array. if a filter for "filterField" is already 
     // defined, remove it from the array 
     // once an entry is removed, we stop looking at the rest of the array. 
     if (currentFilters && currentFilters.length > 0) { 
      for (var i = 0; i < currentFilters.length; i++) { 
       if (currentFilters[i].field == filterField) { 
        currentFilters.splice(i, 1); 
        break; 
       } 
      } 
     } 

     currentFilters.push({ field: filterField, operator: filterOperator, value: filterValue }); 
    } 

    // apply filters 
    dataSource.filter({ 
     logic: "and", 
     filters: currentFilters 
    }); 

    // remove custom filters 
    myCustomGridFilters.length = 0; 
} 

我工作JSFiddle的例子:http://jsfiddle.net/fmpeyton/crhLvq44/

我得到了这个工作,但我注意到我的网格加载数据两次;一旦开始,第二次过滤数据。这显然不理想。

最终,我的目标是在第一次加载时过滤网格,而不必为了过滤而从远程源读取单独的数据源。我怎样才能做到这一点?是否有另一个我应该订阅的活动?

回答

2

只需将您的过滤器添加到数据源。遗憾的是JSFiddle在这里被封锁,所以看不到你的代码。

剑道UI

var dataSource = new kendo.data.DataSource({ 
    data: [ 
     { name: "Tea", category: "Beverages" }, 
     { name: "Coffee", category: "Beverages" }, 
     { name: "Ham", category: "Food" } 
    ], 
    filter: { 
     // leave data items which are "Food" or "Tea" 
     logic: "or", 
     filters: [ 
      { field: "category", operator: "eq", value: "Food" }, 
      { field: "name", operator: "eq", value: "Tea" } 
     ] 
    } 
}); 

剑道MVC

@(Html.Kendo().Grid<MyModel>() 
    .Name("Grid") 
    .Columns(columns => 
    { 
     columns.Bound(c => c.Type); 
     columns.Bound(c => c.Count); 
     columns.Bound(c => c.Date); 
    }) 
    .Filterable() 
    .Pageable(pageable => pageable 
     .PageSizes(true) 
     .ButtonCount(10)) 
    .DataSource(ds => ds 
     .Ajax() 
     .Read(r => r.Action("GetGridData", "Home", new { code = 'code' })) 
     .PageSize(25) 
     .Filter(f => f.Add(a => a.Type).Contains("something")) 
    ) 
) 
+0

我使用MVC的说唱歌手。所以我没有立即访问数据源。我很抱歉,我的例子有点误导。 – 2015-04-02 01:12:01

+0

您没有在MVC代码中定义数据源?你可以发布你的网格源代码吗? – Nicholas 2015-04-02 01:27:37

+0

我正在定义我的MVC代码中的数据源。但我想纯粹用Javascript来做这件事,因为我有一个JS类,它扩展了网格的功能,这个额外的功能最适合这个功能。我将用该代码更新我的问题。 – 2015-04-02 01:36:36

相关问题