Kendo-Knockout: Как фильтровать и сортировать удаленный источник данных?

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

РАЗМЕТКА

<div class="row">
    <div id="Grid" data-bind="kendoGrid: Records"></div>
</div>

JS

var PageVM = function (model) {
    model = model || {};
    var self = this;
    self.Id = ko.observable(model.Id || 0);
    self.Title = ko.observable(model.Title || '');
    self.Slug = ko.observable(model.Slug || '');
    self.MetaKeywords = ko.observable(model.MetaKeywords || '');
    self.MetaDescription = ko.observable(model.MetaDescription || '');
    self.IsEnabled = ko.observable(model.IsEnabled || false);
    self.BodyContent = ko.observable(model.BodyContent || '');
    self.CssClass = ko.observable(model.CssClass || '');
    self.CultureCode = ko.observable(model.CultureCode || '');
}

var ViewModel = function () {
    var self = this;
    self.Records = ko.observableArray([]);

    self.Refresh = function () {
        OData.read({
            requestUri: "/odata/cms/Pages"
        },
        function (data, response) {
            viewModel.Records([]);
            $.each(data.results, function () {
                var pageVM = new PageVM(this);
                viewModel.Records.push(pageVM);
            });
        },
        function (e) {
            alert(e.message);
        });
    };

    self.Edit = function () {
        alert("test");
    };

    ko.bindingHandlers.kendoGrid.options = {
        pageable: {
            refresh: true
        },
        scrollable: false,
        columns: [{
            field: "Title",
            title: "Title"
        }, {
            field: "Slug",
            title: "Slug"
        },{
            field: "IsEnabled",
            title: "IsEnabled"
        },{
            field: "Id",
            title: " ",
            template: '<a onclick="edit()" class="btn btn-default btn-sm">Edit</a> <a href="Delete/#=Id#" class="btn btn-danger btn-sm">Delete</a>'
        }]
    };
};

var viewModel;

$(document).ready(function () {
    viewModel = new ViewModel();
    viewModel.Refresh();
    ko.applyBindings(viewModel);
});

function edit() {
    alert("test");
}

Как видите, я использую OData. Что касается нокаутной привязки kendoGrid, то она взята отсюда: http://rniemeyer.github.io/knockout-kendo/web/Grid.html

Я предполагаю, что мне нужно сначала получить фильтры и сортировки из самого KendoGrid, а затем вручную добавить их в строку запроса odata. Мне также пришлось бы вручную сообщать Кендо общее количество страниц, чтобы он знал, сколько номеров страниц отображать в сетке.

Итак, я думаю, что знаю, что нужно сделать, но я не знаю, с чего начать (например, как мне получить/установить такие данные с помощью KendoGrid?).


person Matt    schedule 06.09.2014    source источник


Ответы (1)


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

Это также заняло некоторое время, чтобы понять это. Следующая ссылка была хорошим началом: http://blogs.telerik.com/kendoui/posts/12-10-25/using_kendo_ui_with_mvc4_webapi_odata_and_ef

Однако это не дало мне всех ответов, которые мне были нужны. Например, мне нужно было выяснить, что веб-API ASP.NET использует свойство value для данных и odata.count для общего количества записей. Вот моя окончательная реализация (за вычетом нокаута):

$(document).ready(function() {
    $("#Grid").kendoGrid({
        data: null,
        dataSource: {
            type: "odata",
            transport: {
                read: {
                    url: "/odata/cms/Pages",
                    dataType: "json"
                }
            },
            schema: {
                data: function (data) {
                    return data.value;
                },
                total: function (data) {
                    return data["odata.count"];
                }
            },
            pageSize: 10,
            serverPaging: true,
            serverFiltering: true,
            serverSorting: true
        },
        filterable: true,
        sortable: true,
        pageable: {
            refresh: true
        },
        scrollable: false,
        columns: [{
            field: "Title",
            title: "Title"
        }, {
            field: "Slug",
            title: "Slug"
        },{
            field: "IsEnabled",
            title: "Is Enabled"
        },{
            field: "Id",
            title: " ",
            template: '<a onclick="editRecord(#=Id#)" class="btn btn-default btn-sm">Edit</a> <a onclick="deleteRecord(#=Id#)" class="btn btn-danger btn-sm">Delete</a>'
        }]
    });
});
person Matt    schedule 07.09.2014