筛选Kendo网格阵列列

时间:2018-09-28 18:12:20

标签: kendo-ui kendo-grid

我有一个Kendo网格,用于显示如下所示的打字稿结构。

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

我希望能够在标签列上进行过滤,但是我不确定该如何实际工作。我可以使用内置的网格过滤功能或通过代码轻松过滤名称列:

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

但是我看不到针对数组对象执行此操作的方法。我希望能够从网格过滤器选项的列表中选择一个标签,但是如果不可能,我会很高兴使用多选并手动设置过滤器。

这是内置的还是相对容易实现的(甚至不是很难做到的)?

2 个答案:

答案 0 :(得分:0)

只要您要进行客户端过滤,就可以在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;
    }});

答案 1 :(得分:0)

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