Ответ 1
var kendoGrid = $("#grid").data('kendoGrid');
var dsSort = [];
dsSort.push({ field: "fieldName1", dir: "asc" });
dsSort.push({ field: "fieldName2", dir: "desc" });
kendoGrid.dataSource.sort(dsSort);
Можно ли программно установить параметр сортировки источника данных 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);
});
Предлагаемые решения, похоже, не доходят до сути (и, тем не менее, я не понимаю, почему я теряю точки репутации для законного вопроса, который, кажется, не настолько тривиален и должен быть рассмотрен в рамках).
Пожалуйста, покажите мне, что я ошибаюсь (я не беспокоюсь о потере репутации - я хотел бы просто понять, как решить проблему). Спасибо!
var kendoGrid = $("#grid").data('kendoGrid');
var dsSort = [];
dsSort.push({ field: "fieldName1", dir: "asc" });
dsSort.push({ field: "fieldName2", dir: "desc" });
kendoGrid.dataSource.sort(dsSort);
Да. Это возможно с помощью параметра sort.
Вот то, что вы спрашиваете: 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"));
});
Итак, вы хотите установить сортировку, прежде чем она будет считывать данные в первый раз? Просто убедитесь, что у вас есть autobind: false на вашем элементе управления ui, затем задайте свойства сортировки на источнике данных, а затем вызовите datasource.read(), когда вы готовы получить отсортированные данные.
Я знаю, чего вы пытаетесь достичь. Я должен был сделать то же самое, потому что мы сохраняем пользовательскую сортировку и фильтрацию (на стороне клиента в моем случае), и мы не можем использовать функции 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();
Надеюсь на эту помощь. Привет!