Kendo-ui网格过滤

时间:2016-03-15 08:43:39

标签: angularjs filter kendo-ui kendo-grid

我试图按标签过滤网格中的项目,网格中的数据看起来像这样

[
    { 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)

我做错了什么,用剑道有更好的方法吗?

1 个答案:

答案 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内。

Working demo