剑道网格 :对数组对象进行过滤

kendo grid : filtering on an array object

本文关键字:对象 过滤 数组 网格      更新时间:2023-09-26

我想过滤一个剑道网格,它的模型有对象列表。

我的筛选器不适用于联系人列表:

这是我的javascript代码:

var typeFilter;
var contactsFilter;
var datesFilter;
var ByFiler;
var zeroFilter = {
    field: "ID",
    operator: "eq",
    value: 0
};
function filterOnMultiSelectContacts(e) {
    var filters;
    for (var i = 0; i < $('#ContactsDropDownFilter').data("kendoMultiSelect").dataItems().length; i++)
    {
        filters =[
                    {
                        field: "Contacts.ContactID",
                        operator: "eq",
                        value: Number($('#ContactsDropDownFilter').data("kendoMultiSelect").dataItems()[i].ContactID)
                    },
                        zeroFilter
        ]
    }
    contactsFilter = {
        logic: "or",
        filters: filters
    };
    applyFilters();
}
function TypeChanged(e) {
    var type = $("#SelectedType").val();
    var value = Number(type);
    if (value === -1) {
        typeFilter = null;
    }
    else {
        typeFilter = {
            logic: "or",
            filters: [
                {
                    field: "Type",
                    operator: "eq",
                    value: value
                },
                zeroFilter
            ]
        };
    }
    applyFilters();
}

function applyFilters() {
    var ds = $("#Grid").data("kendoGrid").dataSource;
    var filters = [];
    if (typeFilter) filters.push(typeFilter);
    if (contactsFilter) filters.push(contactsFilter);
    if (datesFilter) filters.push(datesFilter);
    ds.filter(filters);
}
我的

日期和我的类型的过滤器工作正常,因为字段(模型)不是数组。另一方面,我的filterOnMultiSelectContacts()功能无法正常工作。我猜我的错误是这条线field: "Contacts.ContactID".此行通过添加正确的联系人 ID 工作正常:

Number($('#ContactsDropDownFilter').data("kendoMultiSelect").dataItems()[i].ContactID)

顺便说一下,这是我网格的剃刀数据源:

    .DataSource(dataSource => dataSource
    .Ajax()
    .ServerOperation(false)
    .Events(e => e.Sync("SyncLogEventGrid"))
    .Model(m =>
    {
        m.Id(t => t.LogEventID);
        m.Field(u => u.CreatedByContact).DefaultValue(UserHelper.GetCurrentUserContact(Request.RequestContext));
        m.Field(u => u.CreatedBy).DefaultValue(UserHelper.GetCurrentUserContact(Request.RequestContext).ContactID);
        m.Field(u => u.Contacts).DefaultValue(new List<ContactModel>());
        m.Field(u => u.LogEventAttachments).DefaultValue(new List<LogEventAttachmentModel>());
    })
    )

编辑

我在我的模型中添加了ContactIds,其中包含联系人的Id(而不是整个对象)。我想出了这个,但它仍然不起作用...

function filterOnMultiSelectContacts(e) {
    contactsFilter = null;
    var ContactIdsList = new Array();
    for (var i = 0; i < $('#LogEventContactsDropDownFilter').val().length; i++)
    {
        ContactIdsList.push(Number($('#LogEventContactsDropDownFilter').val()[i]));
    }
    var filters;
    if ($('#LogEventContactsDropDownFilter').data("kendoMultiSelect").dataItems().length > 0) {
        filters = [
                    {
                        field: "ContactIDs",
                        operator: "eq",
                        value: ContactIdsList
                    }
                    ,
                    zeroFilter
        ];
        contactsFilter = {
            logic: "or",
            filters: filters
        };
    }
    else
    {
        contactsFilter = null;
    }
    applyFilters();
}   

我终于让它工作了,这是解决方案:

MyFunctions = {
    getIntersect: function (arr1, arr2) {
        var intersect = [];
        for (i = 0; i < arr2.length; i++) {
            if ($.inArray(arr2[i], arr1) > -1)
                intersect.push(arr2[i]);
        }
        return intersect;
    }
}
function filterOnMultiSelectContacts(e) {
    filterBtnClicked(e, $(this));
    contactsFilter = null;
    var filters;
    if ($('#LogEventContactsDropDownFilter').data("kendoMultiSelect").dataItems().length > 0)
    {
        var ContactIdsList = new Array();
        for (var i = 0; i < $('#LogEventContactsDropDownFilter').val().length; i++) {
            ContactIdsList.push(Number($('#LogEventContactsDropDownFilter').val()[i]));
        }
        filters = [
                    {
                        field: "ContactIDs",
                        operator: function (items, filterValue) {
                            var intersect = MyFunctions.getIntersect(items, ContactIdsList);
                            if (intersect.length > 0) return true;
                            return false;
                        },
                        value: ContactIdsList
                    }
                    ,
                    zeroFilter
                ];
        contactsFilter = {
            logic: "or",
            filters: filters
        };
    }
    else
    {
        contactsFilter = null;
    }
    applyFilters();
}
function applyFilters() {
    var ds = $("#Grid").data("kendoGrid").dataSource;
    var filters = [];
    if (typeFilter) filters.push(typeFilter);
    if (contactsFilter) filters.push(contactsFilter);
    if (datesFilter) filters.push(datesFilter);
    ds.filter(filters);
}

我需要创建一个函数,将给定数组与网格数据源的项目相交。