【问题标题】:kendo - datasource - parameterMap does not bind parameterskendo - datasource - parameterMap 不绑定参数
【发布时间】:2015-06-09 13:25:53
【问题描述】:

我不确定我这样做是否正确,因为我是整个这些系统的新手,但我想管理我的剑道网格数据(分页、过滤器等)。 我在 ASP.NET Web API 2 中使用这个 ODataController,从 OData 包的版本 4 驱动,它支持如下参数: $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
            },

我,在检查了一些东西之后,在这里和那里进行了一些更改,比如设置架构,并添加新的条件(因为它们在示例代码中留空)。

现在,发布给我的是,在运行我的应用程序后,我注意到,即使它没有应用我的 sn-p 代码...

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

但它甚至没有应用其他部分,而且 JavaScript 调试器也不会在函数内部中断...。所以例如它不会添加参数,比如 count...

所以,我先来这里,确保我走正确的路, 其次,如果它是正确的方法,那么如何解决它......

我还阅读了一些关于将内容更改为 JSON 的内容,但我假设我的数据是 JSON,因为我没有定义任何内联字符串...

【问题讨论】:

    标签: javascript kendo-ui odata url-parameters odatacontroller


    【解决方案1】:

    parameterMap 应该在传输层定义(见kendo documentation)。在您的代码中,您确实在 dataSource 级别定义了 parameterMap。

    我不确定您的额外参数是否会按您的意愿发送,但至少它解释了为什么不调用 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.
    });
    

    【讨论】:

    • 我无权访问网页...所以你能在这篇文章中添加一个示例,并发表评论以便我通知
    【解决方案2】:

    kendo 现在确实支持 oData v4,所以只要确保您获得了正确的版本,它就会自动处理 url。 那么你可能想摆脱'parameterMap'部分 并将“读取”更改为

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

    【讨论】:

    • 我没有更新我的库,但我认为这是我的库旧的问题,并且 odata-v4 返回与任何未知值相同的结果,所以你的答案应该是正确的(就像其他人都在谈论这个)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多