将kendo DataSource PageSize预设为“全部”

时间:2019-01-18 14:34:17

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

每当用户更改网格上的分页时,我都会将设置保存在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并显示一个空网格。所以问题是..如何将dataSource的pageSize预设为“全部”?

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

编辑:这变得更加有趣。由于缺少其他选项,因此像注释中一样实现了它,只需直接设置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更改服务器端kendo网格的pageSize(触发对端点的额外请求)。

1 个答案:

答案 0 :(得分:0)

回答问题。这似乎是剑道中的错误。在绑定数据源之后将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;
    }

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