Фильтрующая колонка Kendo Grid Array Column - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть сетка Kendo, которую я использую для отображения структуры машинописи, которая выглядит следующим образом.

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

Я хотел бы иметь возможность фильтровать по столбцу тегов,но я не уверен, как это на самом деле должно работать.Я могу довольно легко фильтровать по столбцу имени, либо с помощью встроенной функции фильтрации сетки, либо по коду:

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

Но я не вижу способа сделать это противмассив объектов.Я бы предпочел иметь возможность выбирать тег из списка в опции фильтра сетки, но если это невозможно, я был бы очень рад использовать множественный выбор и установить фильтр вручную.

Это что-точто встроено или что относительно легко (или даже просто не безумно сложно) реализовать?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Ответ 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
                    });
                }
            }
        }
0 голосов
/ 21 ноября 2018

Пока вы выполняете фильтрацию на стороне клиента, вы можете использовать функцию для поля 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;
    }});
...