Кендо - источник данных - параметр Map не привязывает параметры

Я не уверен, что делаю это правильно, так как я новичок во всех этих системах, но я хочу управлять своими данными сетки кендо (нумерацией страниц, фильтрами и т. Д.). Я использую этот ODataController в ASP.NET Web API 2, основанный на версии 4 пакета OData, который поддерживает такие параметры, как: $top, $skip, $count,. так далее...

Из-за прочтения множества незавершенных hello world, примеров, стекового потока, тестирования многих из них я перехожу к этой части (код ниже), которая поддерживает другие несуществующие параметры (например, take):

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <title>AngularJS</title>
    <link href="../content/shared/styles/examples-offline.css" rel="stylesheet">
    <link href="../Content/telerik/content/web/kendo.common.min.css" rel="stylesheet">
    <link href="../Content/telerik/content/web/kendo.rtl.min.css" rel="stylesheet">
    <link href="../Content/telerik/content/web/kendo.default.min.css" rel="stylesheet">
    <script src="../Content/telerik/scripts/jquery.min.js"></script>
    <script src="../Content/telerik/scripts/angular.min.js"></script>
    <script src="../Content/telerik/scripts/kendo.all.min.js"></script>
    <script src="../content/shared/js/console.js"></script>
    <script>

    </script>


</head>
<body>

    <a class="offline-button" href="../index.html">Back</a>

    <div id="example" ng-app="KendoDemos">
        <div ng-controller="MyCtrl">
            <kendo-grid options="mainGridOptions"></kendo-grid>
        </div>
    </div>
    <script>
    angular.module("KendoDemos", [ "kendo.directives" ]);
    function MyCtrl($scope) {
        $scope.mainGridOptions = {
            dataSource: {
                type: "odata-v4",
                transport: {
                    //read: "http://demos.telerik.com/kendo-ui/service/Northwind.svc/Employees"
                    read: "/odata/people",
                    dataType: "json"
                },
                parameterMap: function (data, operations) {
                    var paramMap = kendo.data.transports.odata.parameterMap(data);
                    if (paramMap.$inlinecount) {
                        if (paramMap.$inlinecount == "allpages") {
                            paramMap.$count = true;
                        }
                        delete paramMap.$inlinecount;
                    }
                    if (paramMap.$take) {
                        paramMap.$top = paramMap.$take;
                        delete paramMap.$take;
                    }
                    if (paramMap.$filter) {
                        paramMap.$filter = paramMap.$filter.replace(/substringof\((.+),(.*?)\)/, "contains($2,$1)");
                    }
                    return paramMap;
                },
                schema: {
                    data: function (data) { return data.value; },
                    total: function (data) { return data['@odata.count']; },
                    model: {
                        id: "Email",
                        fields: {
                            Name: {type: "string"},
                            Email: {type: "string"},
                        }
                    }
                },
                pageSize: 5,
                serverPaging: true,
                serverSorting: true
            },
            sortable: true,
            pageable: true,
            //detailTemplate: kendo.template($("#template").html()),
            dataBound: function() {
                this.expandRow(this.tbody.find("tr.k-master-row").first());
            },
            columns: [
                {
                    field: "Name",
                    title: "Name",
                    width: "200px"
                },
                {
                    field: "Email",
                    title: "E-Mail",
                    width: "200px"
                },
            ]
        };
    }
    </script>
</body>
</html>

В коде используется внедренная анонимная функция, которая позволяет ему определять пользовательские параметры и отображать их.

                parameterMap: function (data, operations) {
                    var paramMap = kendo.data.transports.odata.parameterMap(data);
                    if (paramMap.$inlinecount) {
                        if (paramMap.$inlinecount == "allpages") {
                            paramMap.$count = true;
                        }
                        delete paramMap.$inlinecount;
                    }
                    if (paramMap.$take) {
                        paramMap.$top = paramMap.$take;
                        delete paramMap.$take;
                    }
                    if (paramMap.$filter) {
                        paramMap.$filter = paramMap.$filter.replace(/substringof\((.+),(.*?)\)/, "contains($2,$1)");
                    }
                    return paramMap;
                },
                schema: {
                    data: function (data) { return data.value; },
                    total: function (data) { return data['@odata.count']; },
                    model: {
                        id: "Email",
                        fields: {
                            Name: {type: "string"},
                            Email: {type: "string"},
                        }
                    }
                },
                pageSize: 5,
                serverPaging: true,
                serverSorting: true
            },

Я, после проверки вещей, и немного изменив кое-где, вроде, настройки схемы, и добавив новые условия (так как они оставлены пустыми в примере кода).

Теперь, что мне выдаётся, так это то, что после запуска моего приложения я заметил, что даже оно не применяет мой фрагмент кода...

if (paramMap.$take) {
     paramMap.$top = paramMap.$take;
     delete paramMap.$take;
 }

но он даже не применил другой раздел, а также отладчик JavaScript не сломается внутри функции.... так, например, он не будет добавлять параметры, такие как, считать...

Итак, я прихожу сюда во-первых, убедитесь, что я иду правильным путем, а во-вторых, если это правильный путь, то как это исправить...

Я также прочитал кое-что об изменении вещей в JSON, но я предполагаю, что мои данные - это JSON, так как я не определяю никакую встроенную строку...

2 ответа

Решение

kendo теперь поддерживает oData v4, поэтому просто убедитесь, что вы выбрали правильную версию, и она автоматически обработает URL. тогда вы можете избавиться от части 'parameterMap' и изменить 'read' на

 read: {
                        url:'/odata/people',
                        dataType: 'json'


                    }

Параметр Map должен быть определен на транспортном уровне (см. Документацию кендо). В своем коде вы определили карту параметров на уровне источника данных.

Я не уверен, что ваши дополнительные параметры будут отправлены так, как вы хотите, но, по крайней мере, это объясняет, почему не вызывается parameterMap.

Вот как это должно быть:

var dataSource = new kendo.data.DataSource({
  transport: {
    read: {
      url: "http://whatever.com
    },
    parameterMap: function(data, type) {
      //parameterMap should be a child of the transport object
      //...
    }
  }
  //<-- You added the parameter map there as a transport sibling.
});
Другие вопросы по тегам