【问题标题】:Presetting kendo DataSource PageSize to "All"将剑道数据源页面大小预设为“全部”
【发布时间】:2019-01-18 14:34:16
【问题描述】:

每当用户更改网格上的分页时,我都会将设置保存在 localStorage 中,并在用户再次导航到该页面时检索它以将其重新设置。为了检索它,我使用了 dataSource 的 pageSize 属性,我在其中传递了一个 IIF,如下所示:

    pageSize: function () {
        var pageSize = 10;
        if (window.localStorage) {
            var userPreferencePageSize = localStorage.getItem("somegridPageSize");
            if (userPreferencePageSize === parseInt(userPreferencePageSize)) {
                userPreferencePageSize = parseInt(userPreferencePageSize);
            }

            if (!isNaN(userPreferencePageSize)) {
                pageSize = userPreferencePageSize;
            }
        }
        return pageSize;
    }()

这很有效,但要求用户能够将 pageSize 设置为“All”。 Kendo 在 Grid 中处理“All”,所以我认为这也可以让我将 dataSource pageSize 设置为字符串“All”(pageSize="All")。但是,当我这样做时,网格开始显示 X 记录的 NaN 并显示一个空网格。所以问题是..如何将数据源的 pageSize 预设为“全部”?

注意:另一种方法是只获取网格最大总数,然后用 jquery text("All) 替换下拉列表中显示的数字,但这看起来像一个黑客,在我看来这应该已经内置到框架,但我在文档中找不到任何内容。

编辑:这变得更有趣了。由于缺少其他选项,我像在注释中那样实现了它,只是直接设置了 dataSource pageSize:

$("#Grid").data("kendoGrid").dataSource.pageSize(pageSize);

但这会导致网格上的过滤器出现故障并从端点抛出“字符串格式不正确”(误导性错误)错误。经过足够的研究,我发现它是由 DataSourceRequest 在后台执行一些无法识别的 shuru buru 引起的。由于设置 dataSource pageSize 会导致问题,我尝试以编程方式设置下拉菜单并让 kendo 触发更新 pageSize 本身的请求,如下所示:

            var selectBox = $(".k-pager-sizes").find("select");
            selectBox.val(pageSize);
            selectBox.find("option[value='" + pageSize + "']").prop('selected', true);

但是网格不允许我这样做,并且会不断从 javascript 恢复我在 DOM 中所做的任何更改。

所以问题是,到底如何才能从 javascript 更改服务器端剑道网格的 pageSize(触发对端点的额外请求)。

【问题讨论】:

  • 能否发布您的完整网格定义,以便我们尝试重现该问题?

标签: javascript jquery kendo-ui pagination kendo-grid


【解决方案1】:

回答问题。这似乎是剑道的一个错误。在数据源已绑定后将 pageSize 设置为 0(“all”的快捷方式)将始终导致网格在工具栏模板内声明的任何自定义过滤器出现问题。

确切地说,如果您在工具栏模板内定义了自定义过滤器:

@(Html.Kendo().TextBox().Name("Filter").Deferred())

您通过网格上的 dataSource 定义将其连接起来,例如:

.DataSource(ds =>
    ds.Ajax()
        .PageSize(defaultPageSize)
        .Read(a => a.Action(actionName, controllerName, new
        {
            param = Model.param
        }).Data("getFilterParameters")))

在 javaScript 中获取如下参数:

getFilterParameters: function () {
    return this.filterParameters;
},

用方法填充它们:

filter: function () {
    var grid = $("#Grid").data("kendoGrid");

    this.filterParameters = {
        param: $("#Filter").val()
    };

    grid.dataSource.page(1);
}

有一个简单的事件监听器连接到它:

$("#Filter").on("keyup", filter);

然后在以编程方式将 pageSize 更改为 0/"all" 后:

$("#Grid").data("kendoGrid").dataSource.pageSize(0);

过滤器将开始始终返回 NaN 作为过滤器对象的当前页面/跳过,并使用查询参数传递给服务器(即使网格将正确显示数字)。每当您尝试使用过滤器时,这将导致端点上的框架代码内出现“字符串格式不正确”异常。解决上述问题的方法是稍微修改getFilterParameters方法:

    getFilterParameters: function (e) {
        // Workaround for Kendo NaN pager values if pageSize is set to All 
        if (isNaN(e.page)) e.page = 1;
        if (isNaN(e.skip)) e.skip = 0;
        //
        return this.filterParameters;
    }

这将在提交过滤请求之前重新初始化页面并跳过值。无论如何,这些值将在端点上重新填充正确的值。注意到这一点的不是我,而是另一位从事该项目的开发人员,这归功于她。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2017-09-16
    • 1970-01-01
    相关资源
    最近更新 更多