Вопрос по sorting, kendo-ui, datasource – Программная настройка сортировки сетки

12

Можно ли программно установить параметр сортировки источника данных 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"}
    ]
});

Этот источник данных связан с сеткой Kendo:

var grid = $("element").kendoGrid({
    dataSource: 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);
}); 

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

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

Я должен предположить, что это невозможно. Matteo Piazza
похоже, что он работает в JS, выполняя $ grid.dataSource.sort ({field: "A"Дир: "по убыванию» }, {поле: "B"Дир: "по возрастанию» }, {поле: "C"Дир: "по возрастанию» }, {поле: "D"Дир: "по убыванию» }); Единственная проблема, которую я вижу, заключается в том, что показатели сортировки нет показать на всех столбцах, topwik

Ваш Ответ

5   ответов
2

Вот jsfiddle для именно того, что вы спрашиваете:http://jsfiddle.net/MechStar/c2S5d/

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

myKendoGrid.data (»kendoGrid») .SetDataSource (getKendoDataSource (»Название судна", "по возрастанию»));

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

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

Вы можете сделать это. var myDataSource = new kendo.data.DataSource ({}); myDataSource.sort = [{field: "myFieldName»Дир: "по возрастанию»}, {поле: "myOtherField»Дир: "по убыванию»}]; Затем вызовите myDataSource.read (); Robin Giltner
Хорошо, но если я хочу установить сортировку после, вне объявления источника данных, перед каждым вызовом чтения, потому что условие сортировки изменяется или просто сбрасывается до значения по умолчанию? Мне кажется, что единственный способ добиться этого - уничтожить существующий источник данных, создав новый с новым параметром сортировки. Matteo Piazza
28
var kendoGrid = $("#grid").data('kendoGrid');
var dsSort = [];
dsSort.push({ field: "fieldName1", dir: "asc" });
dsSort.push({ field: "fieldName2", dir: "desc" });
kendoGrid.dataSource.sort(dsSort);
Можно ли обновить фактическую сортировку grid.dataSource.data ()? не только вид agDev
Я думаю, что это должно быть отмечено как ответ. Drew Delano
0

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

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

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

Когда вы делаетеdataSource.sort ()это увольняетменять событие, точитать делается в 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();

Надеюсь, это поможет. С уважением!

2

Да. Это возможно черезСортировать установка.

Не на самом деле, сортировка вызывает второй вызов на сервер. Я хотел бы изменить сортировку перед чтением данных, изменив сортировку по умолчанию. Matteo Piazza
Вздох ... Вы действительно попробовали это? Возможно, вы используете метод сортировки вместо опции конфигурации сортировки. Atanas Korchev
Затем используйте функцию parameterMap. Он вызывается каждый раз, когда делается запрос. Найти больше информации в документах:docs.kendoui.com/api/framework/... Atanas Korchev
Я попробовал оба. Не могли бы вы привести пример? Пожалуйста, обратитесь к комментарию, который я оставил другому ответу, чтобы понять, что я пытаюсь сделать. Matteo Piazza

Похожие вопросы