【发布时间】:2017-05-04 10:34:51
【问题描述】:
我有一个网格,其中包含工具栏中的三个多选控件,用于根据所做的选择过滤网格数据源。
目前,我有以下函数,在任何多选控件中的 change 事件期间触发。此函数接受 values,其中包含已更改的多选控件中的选定项目和 filterID,这是在过滤期间使用的 field 名称。
function applyClientFilters(values, filterID) {
var grid = $("#grid").data("kendoGrid");
var gridDataSource = grid.dataSource;
var filter = gridDataSource.filter();
// does the selected drop down contain a value
// if yes, then apply this filter to the necessary drop down
// otherwise remove the filter
if (values.length > 0) {
// has a filter been setup yet on the datasource?
if (filter && filter.filters.length > 0) {
// firstly check to see if filter has already been applied and if so remove
for (var i = 0; i < filter.filters.length; ++i) {
// check to see if filter field already exists i.e. analyte has already been filtered
// and check to see if the value at this field already exists as a filtered item
if (filter.filters[i].field === filterID && values.indexOf(filter.filters[i].value) > -1) {
filter.filters.splice(i, 1);
}
}
// apply new filter(s)
for (var i = 0; i < values.length; ++i) {
filter.filters.push({ field: filterID, operator: "eq", value: parseInt(values[i]) });
}
gridDataSource.query({
filter: filter,
pageSize: 10,
page: 1,
group: [{
field: "InstrumentName",
dir: "asc"
}, {
field: "AnalyteName",
dir: "asc"
}, {
field: "MethodName",
dir: "asc"
}]
});
}
else {
// apply new filter
gridDataSource.filter({
logic: "or",
filters: [
{
field: filterID,
operator: "eq",
value: parseInt(values),
}
]
});
}
} else {
if (filter && filter.filters.length > 0) {
// remove existing filter
for (var i = 0; i < filter.filters.length; ++i) {
if (filter.filters[i].field === filterID) {
filter.filters.splice(i, 1);
}
}
gridDataSource.query({
filter: filter,
pageSize: 10,
page: 1,
group: [{
field: "InstrumentName",
dir: "asc"
}, {
field: "AnalyteName",
dir: "asc"
}, {
field: "MethodName",
dir: "asc"
}]
});
}
}
}
仅使用 or 逻辑时,对单个多选选择进行过滤即可,即选择多个方法将按预期过滤它们。但是,当在不同的多选控件中使用时,逻辑需要为and。
示例
- 选择“分析物 A”-> 过滤网格数据源以仅显示“分析物 A”
- 选择“方法 A”-> 过滤网格数据源以显示“分析物 A”和“方法 A”
- 选择“方法 B”-> 过滤网格数据源以显示“分析物 A”和“方法 A”或“方法 B”
是否可以将过滤逻辑运算符与Kendo数据源过滤结合起来实现上述场景?
【问题讨论】:
标签: javascript jquery kendo-ui kendo-datasource kendo-multiselect