Sorting 以编程方式设置网格排序

Sorting 以编程方式设置网格排序,sorting,datasource,kendo-ui,Sorting,Datasource,Kendo Ui,在读取数据和避免第二次服务器读取之前,是否可以通过编程方式设置KendoUI数据源的sort参数? 作用域在特定用户交互上设置默认排序。怎么做 这是我试图做的一个例子,因为答案没有切中要害(或者我不理解事情是如何运作的) 我定义了一个带有初始排序的剑道数据源: var datasource = new kendo.data.DataSource({ parameterMap: function (inputParams, operation) { return JSON.

在读取数据和避免第二次服务器读取之前,是否可以通过编程方式设置KendoUI数据源的sort参数? 作用域在特定用户交互上设置默认排序。怎么做

这是我试图做的一个例子,因为答案没有切中要害(或者我不理解事情是如何运作的)

我定义了一个带有初始排序的剑道数据源:

var datasource = new kendo.data.DataSource({
    parameterMap: function (inputParams, operation) {
        return JSON.stringify(inputParams)
    },
    // default sort
    sort: [
        {field: "field_1", dir: "asc"},
        {field: "field_2", dir: "asc"}
    ]
});
此数据源绑定到剑道网格:

var grid = $("element").kendoGrid({
    dataSource: datasource   
});
然后我有一个按钮,它调用数据源上的“读取”,并用第一页数据填充网格:

$("#btn").bind("click", function(e) {
    datasource.page(1);
}); 
这样,单击按钮后,用户将获得按“field_1”和“field_2”排序的数据,网格将在列标题上显示这种排序。然后,用户可以通过单击列标题以任何方式对数据重新排序

我想做的是将默认排序重置为初始排序,如DataSource声明中定义的那样,在列标题上再次显示它,而无需再次创建新的DataSource

比如:

$("#btn").bind("click", function(e) {
    datasource.sort = [
        {field: "field_1", dir: "asc"},
        {field: "field_2", dir: "asc"}
    ]; 
    datasource.page(1);
}); 
提供的解决方案似乎没有达到目的(而且我仍然不明白为什么我会因为一个看似不那么琐碎且应该由框架解决的合法问题而失去信誉点)


请告诉我我错了(我不担心失去声誉-我只想知道如何解决问题)。

是的。可以通过设置进行排序。

那么您想在排序第一次读取数据之前设置排序吗?只要确保您的ui控件上有autobind:false,然后在数据源上设置排序属性,然后在准备获取排序数据时调用datasource.read()。

下面是一个JSFIDLE,它正好满足您的要求:

var kendoGrid = $("#grid").data('kendoGrid');
var dsSort = [];
dsSort.push({ field: "fieldName1", dir: "asc" });
dsSort.push({ field: "fieldName2", dir: "desc" });
kendoGrid.dataSource.sort(dsSort);
简单地说,首先需要将数据源设置为null,然后在从用户获得所需输入时注入数据源:

myKendoGrid.data(“kendoGrid”).setDataSource(getKendoDataSource(“ShipName”、“asc”))


我知道你在努力实现什么。我必须这样做,因为我们正在保存用户排序和筛选(在我的例子中是客户端),并且由于其他原因,我们不能使用网格函数getOptions/setOptions。 即使设置了autobind:false,如果您看到autobind的定义,这也不会像您预期的那样起作用:

如果设置为false,则小部件在初始化期间不会绑定到数据源。在这种情况下,当触发数据源的更改事件时,将发生数据绑定。默认情况下,小部件将绑定到配置中指定的数据源

当您执行dataSource.sort()时,会触发一个change事件,然后在数据源中隐式执行读取(这就是为什么您有第二个服务器读取)

因此,您需要做的是使用所需的排序选项创建一个新的数据源,然后显式调用dataSource.read()

例如(您可以扩展默认选项以不重复配置):

希望这有帮助。
问候

实际上,排序不会调用对服务器的第二个调用。我想在读取数据之前更改排序,修改默认排序。叹气。。。你真的试过了吗?也许您使用的是sort方法而不是sort配置选项。你能举个例子吗?请参考我给另一个答案留下的评论,了解我正在尝试做什么。然后使用parameterMap函数。每次发出请求时都会调用它。在文档中找到更多信息:好的,但是如果我想在数据源声明之外,在每次读取调用之前设置sort,因为排序条件改变或者只是重置为默认值?在我看来,实现这一点的唯一方法是销毁现有的数据源,使用新的排序参数创建一个新的数据源。var myDataSource=new kendo.data.DataSource({});myDataSource.sort=[{field:“myFieldName”,dir:“asc”},{field:“myOtherField”,dir:“desc”}];然后调用myDataSource.read();我认为这是不可能的,它似乎在JS中通过执行$grid.dataSource.sort({field:“A”,dir:“desc”},{field:“B”,dir:“asc”},{field:“C”,dir:“asc”},{field:“D”,dir:“desc”})来工作;但我看到的唯一问题是排序指示符并没有显示在所有列上,是否可以更新实际的grid.dataSource.data()排序?不仅仅是风景
var getKendoDataSource = function (sidx, sord) {
  return new kendo.data.DataSource({
    type: "odata",
    transport: {
      read: "http://demos.kendoui.com/service/Northwind.svc/Orders"
    },
    pageSize: 10,
    serverPaging: true,
    serverSorting: true,
    sort: {
      field: sidx ? sidx : "",
      dir: sord ? sord : ""
    }
  });
};
var myKendoGrid = $("#grid").kendoGrid({
  columns: [
    { field: "OrderID" },
    { field: "ShipName" },
    { field: "ShipCity" }
  ],
  dataSource: null,
  pageable: {
    pageSizes: [10, 20, 50, 100, 200]
  },
  resizable: true,
  scrollable: false,
  sortable: {
    allowUnsort: false
  }
});
$("#link").click(function () {
  myKendoGrid.data("kendoGrid")
    .setDataSource(getKendoDataSource("ShipName", "asc"));
});
var options = $.extend({}, dataSourceOptions);
options.sort = [
        {field: "field_1", dir: "asc"},
        {field: "field_2", dir: "asc"}
    ];
var dataSource = new kendo.data.DataSource(options);
grid.setDataSource(dataSource);
grid.dataSource.read();