angularjs 如何定义两个日期之间的剑道网格列过滤器?

zd287kbt  于 2023-06-21  发布在  Angular
关注(0)|答案(3)|浏览(170)

在我们的应用程序中,我们希望日期列上的过滤器提示用户输入开始日期和结束日期,过滤器返回有问题的字段福尔斯这两个日期之间(或之上)的行。

初始方法

我们最初的方法是限制日期类型使用gte和lte操作符,并添加“extra:true”可过滤选项。这很接近,但存在以下问题:A)每个日期输入可以使用gte(开始)或lte(结束)操作符,这提供了不希望的灵活性,并为用户提供了创建永远不会返回结果的过滤器的选项,以及B)呈现了我们不想要的逻辑比较(And / Or)。

更好的方法

This question有一个马修·欧文的答案,让我们非常接近:它允许我们完全重新设置过滤器的样式,因此我们可以简单地显示开始日期输入和结束日期输入。但是,我无法将正确的过滤操作与正确的输入(gte表示开始日期,lte表示结束日期)相关联。我的自定义过滤器如下:

$scope.dateFilter = {
    extra: true,
    operators: {},
    ui: function (element) {
        var parent = element.parent();
        while (parent.children().length > 1)
            $(parent.children()[0]).remove();

        parent.prepend(
            "Start Date:<br/><span class=\"k-widget k-datepicker k-header\">" +
            "<span class=\"k-picker-wrap k-state-default\">" +
            "<input data-bind=\"value: filters[0].value\" class=\"k-input\" type=\"text\" data-role=\"datepicker\"" +
            " style=\"width: 100%\" role=\"textbox\" aria-haspopup=\"true\" aria-expanded=\"false\" aria-disabled=\"false\" " +
            " aria-readonly=\"false\" aria-label=\"Choose a date\">" +
            "<span unselectable=\"on\" class=\"k-select\" role=\"button\">" +
            "<span unselectable=\"on\" class=\"k-icon k-i-calendar\">select</span></span></span></span>" +

            "<br/>End Date:<br/>" +
            "<span class=\"k-widget k-datepicker k-header\"><span class=\"k-picker-wrap k-state-default\">" +
            "<input data-bind=\"value: filters[1].value\" class=\"k-input\" type=\"text\" data-role=\"datepicker\"" +
            " style=\"width: 100%\" role=\"textbox\" aria-haspopup=\"true\" aria-expanded=\"false\" " +
            " aria-disabled=\"false\" aria-readonly=\"false\" aria-label=\"Choose a date\">" +
            "<span unselectable=\"on\" class=\"k-select\" role=\"button\">" +
            "<span unselectable=\"on\" class=\"k-icon k-i-calendar\">select</span></span></span></span>"
        );
    }
};

使用这种方法,将为每个日期生成Odata过滤器选项,但它使用eq等于运算符,因此不会返回任何值。我们不是专门在数据源上构建过滤器。
有没有一种简单的方法可以将这些日期输入中的每一个与特定的过滤操作符关联起来?有没有更好的方法来处理这个问题?看起来基于开始-结束范围过滤日期是通常所需的。

其他详情

我们正在使用AngularJS和WebAPI与Odata。

xoshrz7s

xoshrz7s1#

在与Telerik合作后,我得到了一个答案。我打开的线程可以在这里找到,但我也会在这个答案中总结。
最终的解决办法是:

  • 使用列“可过滤”选项的“消息”选项来自定义过滤器显示消息。
  • 使用列“filterable”选项的“Extra”选项在过滤器菜单中获取额外的日期选择器。
  • 在网格可过滤选项中配置“运算符”选项,以设置哪些运算符可用于日期(gte、lte)以及为每个日期显示的文本(开始日期、结束日期)。
  • 使用filterMenuInit事件配置筛选器控件。
    最终结果

列可过滤

使用了以下可过滤选项:

filterable: { "extra": "true", "messages": { "info": "Show items between dates:" }}

Extra给了我们第二个日期选择器,“info”消息自定义了过滤器菜单顶部显示的文本。

网格可过滤

我在网格级别的“可过滤”选项中使用了“操作符”选项,使日期过滤器仅提供gte和lte操作符,并为这些操作符定制文本。操作符配置对象最终看起来像这样:

"date": {
                "gte": "Begin Date",
                "lte": "End Date"
            }

因为我们希望这适用于所有日期,所以我们将其放在工厂中,并在每个Angular 控制器/视图中重用它。

filterMenuInit事件

通过为filterMenuInit事件提供处理程序,可以在创建筛选器菜单时访问和配置其中的各个控件。我创建的handler函数看起来像这样:

function (e) {
            if (e.sender.dataSource.options.schema.model.fields[e.field].type == "date") {
                var beginOperator = e.container.find("[data-role=dropdownlist]:eq(0)").data("kendoDropDownList");
                beginOperator.value("gte");
                beginOperator.trigger("change");
                beginOperator.readonly();

                var logicOperator = e.container.find("[data-role=dropdownlist]:eq(1)").data("kendoDropDownList");
                logicOperator.readonly();

                var endOperator = e.container.find("[data-role=dropdownlist]:eq(2)").data("kendoDropDownList");
                endOperator.value("lte");
                endOperator.trigger("change");
                beginOperator.readonly();
            }

具体来说,对于任何日期字段,此函数将第一个和最后一个下拉操作符分别设置为“gte”和“lte”(这些是第一个日期运算符和第二个日期运算符的下拉列表),并将所有下拉列表设置为只读,以便用户无法更改它们(唯一的另一个下拉列表,位于索引1,是逻辑比较-只有And有意义,所以我们不让用户更改它。
此函数将此配置应用于任何“日期”类型的字段。我这样做是为了创建这个函数一次,把它放在一个Angular工厂中,然后在我需要的任何网格中重用它。如果您不想将其作为一个总括配置应用于所有日期列,则可以更改条件以按名称检查字段。示例:

if (e.field == "fieldName")

希望这对其他人有帮助。这并不能给予你在过滤器菜单中对UI进行最终的自定义,但它确实可以让你在两个日期之间简单地设置一个过滤器。我相信一些聪明的人可以将这个策略与我最初的策略(完全替换过滤器菜单的标记)结合起来,以实现完全自定义的功能。

b4lqfgs4

b4lqfgs42#

您可以尝试以下方法,该方法提供两个过滤选项:具有两个筛选字段和网格列。

<div>
    From: <input id="from" /> To: <input id="to" />
    <br />
    <br />
    <button id="filter" class="k-button">Filter</button>
</div>
<br />
<br />
<div id="grid"></div>
<script>
    var grid = $("#grid").kendoGrid({
        dataSource: {
            type: "json",
            transport: {
                read: "/Controller/Action"
            },
            pageSize: 10,
            schema: {
                model: {
                    fields: {
                        OrderId: { type: 'number' },
                        OrderItem: { type: 'string' },
                        OrderDate: { type: 'date' }
                    }
                }
            }
        },
        pageable: true,
        filterable: true,
        navigatable: true,
        selectable: true,
        columns:
        [
            { field: "OrderID", width: 100, title: "Order ID", filterable: false },
            { field: "OrderItem", width: 100, title: "Order Item", filterable: false },
            {
                field: "OrderDate", type: "date", width: 125, title: "Order Date",
                template: "#= kendo.toString(kendo.parseDate(EventTime, 'dd.MM.yyyy hh:mm tt'), 'dd.MM.yyyy hh:mm tt') #",
                filterable: {
                    ui: "datetimepicker"
                }
            },
        ]
    }).data("kendoGrid");

    $("#from, #to").kendoDatePicker({
    });

    $("#filter").on("click", function () {
        //var from = $("#from").data("kendoDatePicker").value();
        //var to = $("#to").data("kendoDatePicker").value();

        //If there is a problem regarding to the two lines above, you can also try this:
        var from = $("#from").val();
        var to = $("#to").val();

        var filter = [
            { field: "OrderDate", operator: "gte", value: from },
            { field: "OrderDate", operator: "lte", value: to }
        ];
        grid.dataSource.filter(filter);
    });
</script>

更多信息Date Range Filtering in Kendo Grid Using WEB API and Entity Framework .

0ve6wy6x

0ve6wy6x3#

$(document).on(“click”,“#btnFindCreditMemos”,function(){

let txtCMFromDate = $("#txtCMFromDate").data("kendoDatePicker").value()
let txtNewCMToDate = $("#txtCMToDate").data("kendoDatePicker").value()
let grid = $("#examplegrid").data("kendoGrid");
let $dateRange = new Array();
$dateRange =  [
        { field: "DateField", operator: "gte", value: txtCMFromDate },
        { field: "DateField", operator: "lte", value: txtNewCMToDate }
    ]
grid.dataSource.filter($dateRange);

});
“DateField”是剑道网格中的列,我们将根据它来过滤表。

相关问题