代码之家  ›  专栏  ›  技术社区  ›  Joe

过滤剑道网格数组列

  •  0
  • Joe  · 技术社区  · 7 年前

    我有一个剑道网格,我用它来显示一个类似这样的typescript结构。

    { companyId: string, name: string, inceptionDate: Date, tags: string[] }

    我希望能够过滤标签栏,但我不确定这到底应该如何工作。我可以很容易地在“名称”列上进行过滤,可以使用内置的网格过滤功能,也可以通过代码:

    baseFilter.filters.push({ field: "name", operator: "contains", value: "myValue" });

    但我看不到一种方法可以对数组对象执行此操作。我希望能够从网格过滤器选项中的a列表中选择一个标记,但如果不可能,我很乐意使用multiselect并手动设置过滤器。

    这是内置的还是相对容易(甚至不是非常难)实现的?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Matt Jenkins    7 年前

    只要你在做客户端过滤,你就可以为 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;
        }});
    
        2
  •  0
  •   SylvainB2347    7 年前

    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
                        });
                    }
                }
            }