我试图按标签过滤网格中的项目,网格中的数据看起来像这样
[
{ id: 0, tags: [{ text: 'boat' }, { text: 'summer' }] },
{ id: 1, tags: [{ text: 'boat' }] },
{ id: 2, tags: [{ text: 'travel' }] },
{ id: 3, tags: [{ text: 'boat' }] },
{ id: 4, tags: [{ text: 'travel' }] },
{ id: 5, tags: [{ text: 'travel' }, { text: 'summer' }] }
]
过滤功能如下所示
$scope.filterGrid = function (e) {
var grid = $('#imageGrid').data('kendoGrid');
var val = [{ text: 'travel' }, { text: 'summer' }];
grid.dataSource.filter({});
if ($.trim(val) !== '') {
grid.dataSource.filter({
logic: 'or',
filters: [{
field: 'tags',
operator: function (item) {
var status = false;
for (var n = 0, length2 = val.length; n < length2; n++) {
for (var i = 0, length = item.length; i < length; i++) {
if (item[i].text.indexOf(val[n].text) !== -1) {
status = true;
break;
}
}
}
return status;
}
}]
});
}
};
这个例子中val = travel,夏天我想只显示带有两个标签的项目(id 5),但它显示包含任一标签的所有项目(id:0,2,4,5)
我做错了什么,用剑道有更好的方法吗?
答案 0 :(得分:0)
您的过滤器算法接受item
至少拥有两个所需值中的一个,因为在此处找到一个循环中断:
if (item[i].text.indexOf(val[n].text) !== -1) {
status = true;
break;
}
我已将您的代码更改为:
operator: function (item) {
var found = 0;
for (var i = 0, length = item.length; i < length; i++) {
for (var n = 0, length2 = val.length; n < length2; n++) {
if (item[i].text.indexOf(val[n].text) !== -1) {
found++;
break;
}
}
}
return found == val.length;
}
仅当找到的项目数与搜索项目(found
)相同时,它才会计算找到的标记总数(true
)并返回val.length
。所以它开始迭代item
,而不是val
,因为规则代表项必须是所有值,而不是方式。因此,对每个item
执行检查是否包含所有val
项和总和found
计数器。最后,如果found
相等val.length
,则表示val
上的所有项都在item
内。