我有一个Kendo网格,用于显示如下所示的打字稿结构。
{
companyId: string,
name: string,
inceptionDate: Date,
tags: string[]
}
我希望能够在标签列上进行过滤,但是我不确定该如何实际工作。我可以使用内置的网格过滤功能或通过代码轻松过滤名称列:
baseFilter.filters.push({ field: "name", operator: "contains", value: "myValue" });
但是我看不到针对数组对象执行此操作的方法。我希望能够从网格过滤器选项的列表中选择一个标签,但是如果不可能,我会很高兴使用多选并手动设置过滤器。
这是内置的还是相对容易实现的(甚至不是很难做到的)?
答案 0 :(得分:0)
只要您要进行客户端过滤,就可以在operator
字段中使用一个函数。
一个简单的示例(在js中):
baseFilter.filters.push({
field: "tags",
operator: function (tags, value) {
for (var i = 0; i < tags.length; i++) {
var tag = tags[i];
if (tag === value)
return true;
}
return false;
}});
答案 1 :(得分:0)
TerminalSamurai的答案对我有用!
这是我的完整代码(检查是否已存在过滤器)
var grid = $("#GridListeModelesDocumentPatient_@Model.PatientId").data("kendoGrid");
if (grid != null) {
var filterHandler = grid.dataSource.filter();
if (dataItem.Nom == "Tous") {
if (filterHandler != null) {
var existingFilters = filterHandler.filters;
for (var i = existingFilters.length - 1; i >= 0; i--) {
if (existingFilters[i].field == "ModelesMotifs") {
existingFilters.splice(i, 1);
}
}
grid.dataSource.filter(existingFilters);
} else {
grid.dataSource.filter({});
}
} else {
if (filterHandler != null) {
var existingFilters = filterHandler.filters;
for (var i = existingFilters.length - 1; i >= 0; i--) {
if (existingFilters[i].field == "ModelesMotifs") {
existingFilters.splice(i, 1);
}
}
var new_filter = {
field: "ModelesMotifs",
operator: function (modelesMotifs, value) {
for (var i = 0; i < modelesMotifs.length; i++) {
var modeleMotif = modelesMotifs[i];
if (modeleMotif.MotifId === value)
return true;
}
return false;
},
value: dataItem.MotifId
};
existingFilters.push(new_filter);
grid.dataSource.filter(existingFilters);
} else {
grid.dataSource.filter({
field: "ModelesMotifs",
operator: function (modelesMotifs, value) {
for (var i = 0; i < modelesMotifs.length; i++) {
var modeleMotif = modelesMotifs[i];
if (modeleMotif.MotifId === value)
return true;
}
return false;
},
value: dataItem.MotifId
});
}
}
}