Kendo Grid具有服务器过滤功能,但客户端分页

时间:2019-08-05 12:55:01

标签: javascript kendo-ui kendo-grid kendo-datasource

您好,我有一个启用了服务器筛选的kendo网格,并且由于复杂的sql脚本和性能优化,我一次加载了所有数据,因此将serverPaging设置为false。但是,当我单击网格中的下一页按钮或更改页面大小时,我始终向服务器发送新请求,并将再次加载相同的数据。有什么方法可以启用服务器筛选并设置我的网格以进行clinet侧分页吗? 这是我的网格对象的构造函数参数。

{
    dataSource: {
        serverFiltering: true,
        pageSize: 10,
        transport: {
            read: {
                url: "url",
                dataType: "json",
                type: 'POST',
                contentType: "application/json;charset=UTF-8"
            },
            parameterMap: function (data) {
                return JSON.stringify(data);
            }
         }
    },
    columns[...],
    pageable: {
        pageSizes: [10, 25, 50, 100],
        buttonCount: 3
    }
}

1 个答案:

答案 0 :(得分:0)

通常不建议在服务器和客户端之间分隔网格数据操作,如documentation中所述:

  

所有数据操作必须在服务器或客户端上进行。尽管您仍然可以确定部分数据操作将保留在服务器上,而部分数据保留在客户端上,但在其混合数据操作模式下使用DataSource会导致意外的副作用。例如,如果启用serverPaging而禁用serverFiltering,则数据源将仅过滤当前页面中的数据,并且用户看到的结果少于预期。在其他情况下,DataSource发出的请求可能会超出执行数据操作所需的请求。

似乎最后一部分适用于您的情况。一种可能的解决方法是将transport.read实现为一个函数,该函数使您可以完全控制如何检索数据。您可以使用以下方法将数据缓存在浏览器中,然后重新使用:

<script>
var resultCache;
var dataSource = new kendo.data.DataSource({
  serverFiltering: true,
  pageSize: 10,
  transport: {
    read: function(options) {
      if (resultCache != null) {
        options.success(resultCache);
      } else {
        $.ajax({
          url: "url",
          dataType: "json",
          success: function(result) {
            resultCache = result;
            // notify the data source that the request succeeded
            options.success(result);
          },
          error: function(result) {
            // notify the data source that the request failed
            options.error(result);
          }
        });
      }
    }
  }
});
</script>