KendoUI: программная настройка сортировки сетки

Можно ли программно установить параметр сортировки источника данных KendoUI перед чтением данных и избежать второго чтения сервера? Область определяет настройку по умолчанию для определенного взаимодействия с пользователем. Как?

Вот пример того, что я пытаюсь сделать, потому что ответы не доходят до сути (или, может быть, я не понимаю, как все работает).

Я определяю источник данных Kendo с исходным типом:

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"}
    ]
});

Этот DataSource привязан к сетке Kendo:

var grid = $("element").kendoGrid({
    dataSource: datasource   
});

Затем у меня есть кнопка, которая вызывает "чтение" в DataSource и заполняет сетку первой страницей данных:

$("#btn").bind("click", function(e) {
    datasource.page(1);
}); 

Таким образом, после нажатия кнопки пользователь получает данные, упорядоченные по "field_1" и "field_2", и сетка показывает этот вид в заголовках столбцов. Затем пользователь может изменить порядок данных, нажав на заголовок столбца.

То, что я хотел бы сделать, это reset сортировка по умолчанию исходной, как определено в объявлении DataSource, показывая ее снова в заголовках столбцов и не создавая новый DataSource снова.

Что-то вроде:

$("#btn").bind("click", function(e) {
    datasource.sort = [
        {field: "field_1", dir: "asc"},
        {field: "field_2", dir: "asc"}
    ]; 
    datasource.page(1);
}); 

Предлагаемые решения, похоже, не доходят до сути (и, тем не менее, я не понимаю, почему я теряю точки репутации для законного вопроса, который, кажется, не настолько тривиален и должен быть рассмотрен в рамках).

Пожалуйста, покажите мне, что я ошибаюсь (я не беспокоюсь о потере репутации - я хотел бы просто понять, как решить проблему). Спасибо!

Ответ 1

var kendoGrid = $("#grid").data('kendoGrid');
var dsSort = [];
dsSort.push({ field: "fieldName1", dir: "asc" });
dsSort.push({ field: "fieldName2", dir: "desc" });
kendoGrid.dataSource.sort(dsSort);

Ответ 2

Да. Это возможно с помощью параметра sort.

Ответ 3

Вот то, что вы спрашиваете: http://jsfiddle.net/MechStar/c2S5d/

В двух словах вам нужно сначала установить источник данных в null, а затем ввести источник данных, когда вы получите нужный ввод от пользователя:

myKendoGrid.data( "kendoGrid" ). setDataSource (getKendoDataSource ( "ShipName", "asc" ));

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"));
});

Ответ 4

Итак, вы хотите установить сортировку, прежде чем она будет считывать данные в первый раз? Просто убедитесь, что у вас есть autobind: false на вашем элементе управления ui, затем задайте свойства сортировки на источнике данных, а затем вызовите datasource.read(), когда вы готовы получить отсортированные данные.

Ответ 5

Я знаю, чего вы пытаетесь достичь. Я должен был сделать то же самое, потому что мы сохраняем пользовательскую сортировку и фильтрацию (на стороне клиента в моем случае), и мы не можем использовать функции gridOpions/setOptions по другим причинам. Даже если вы установите autobind: false, это не будет работать так, как вы ожидаете, если вы видите определение для autobind:

http://docs.telerik.com/kendo-ui/api/javascript/ui/grid#configuration-autoBind

Если установлено значение false, виджет не будет привязываться к источнику данных во время инициализации. В этом случае привязка данных произойдет, когда событие изменения источника данных будет запущено. По умолчанию виджет будет привязан к источнику данных, указанному в конфигурации.

Когда вы выполняете dataSource.sort(), это вызывает событие change, затем читать выполняется в dataSource неявно (почему у вас есть второе чтение сервера).

Итак, вам нужно создать новый источник данных с необходимыми параметрами сортировки, а затем явно вызвать dataSource.read().

Например (вы можете расширить параметры по умолчанию, чтобы не повторять конфигурацию):

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();

Надеюсь на эту помощь. Привет!