【问题标题】:Kendo-ui grid filteringKendo-ui 网格过滤
【发布时间】:2016-03-15 20:44:19
【问题描述】:

我正在尝试通过标签过滤网格中的项目,网格中的数据如下所示

[
    { 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, summer 我只想显示带有两个标签(id 5)的项目,但它显示了包含任何一个标签(id:0,2,4,5)的所有项目

我做错了什么,有没有更好的方法来用剑道做到这一点?

【问题讨论】:

    标签: angularjs filter kendo-ui kendo-grid


    【解决方案1】:

    您的过滤算法接受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)并仅在找到的项目数与搜索项目数相同时返回trueval.length)。所以它开始遍历item,而不是val,因为规则代表项目必须是所有值,而不是反过来。因此,对于每个 item 执行检查它是否具有所有 val 项目和总和 found 计数器。最后,如果found 等于val.length,则意味着val 上的所有项目都在item 内。

    Working demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-22
      • 1970-01-01
      • 2019-07-26
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多