我有一个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/
我得到了这个工作,但我注意到我的网格加载数据两次;一旦开始,第二次过滤数据。这显然不理想。
最终,我的目标是在第一次加载时过滤网格,而不必为了过滤而从远程源读取单独的数据源。我怎样才能做到这一点?是否有另一个我应该订阅的活动?
我使用MVC的说唱歌手。所以我没有立即访问数据源。我很抱歉,我的例子有点误导。 – 2015-04-02 01:12:01
您没有在MVC代码中定义数据源?你可以发布你的网格源代码吗? – Nicholas 2015-04-02 01:27:37
我正在定义我的MVC代码中的数据源。但我想纯粹用Javascript来做这件事,因为我有一个JS类,它扩展了网格的功能,这个额外的功能最适合这个功能。我将用该代码更新我的问题。 – 2015-04-02 01:36:36