kendo - 数据源 - parameterMap 不绑定参数
kendo - datasource - parameterMap does not bind parameters
我不确定我这样做是否正确,因为我是整个这些系统的新手,但我想管理我的 kendo 网格数据(分页、过滤器等)。
我在 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(,)");
}
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(,)");
}
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 调试器不会在函数内部中断...。因此,例如它不会添加参数,例如 count...
所以,我先来这里,确保我走对了路,
其次,如果它是正确的方法,那么如何解决它...
我还阅读了一些关于将内容更改为 JSON 的内容,但我假设我的数据是 JSON,因为我没有定义任何内联字符串...
kendo 现在支持 oData v4,所以只要确保你的版本正确,它就会自动处理 url。
那么你可能想去掉 'parameterMap' 部分
并将 'read' 更改为
read: {
url:'/odata/people',
dataType: 'json'
}
parameterMap 应在传输级别定义(请参阅 kendo documentation)。在您的代码中,您确实在数据源级别定义了 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.
});
我不确定我这样做是否正确,因为我是整个这些系统的新手,但我想管理我的 kendo 网格数据(分页、过滤器等)。 我在 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(,)");
}
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(,)");
}
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 调试器不会在函数内部中断...。因此,例如它不会添加参数,例如 count...
所以,我先来这里,确保我走对了路, 其次,如果它是正确的方法,那么如何解决它...
我还阅读了一些关于将内容更改为 JSON 的内容,但我假设我的数据是 JSON,因为我没有定义任何内联字符串...
kendo 现在支持 oData v4,所以只要确保你的版本正确,它就会自动处理 url。 那么你可能想去掉 'parameterMap' 部分 并将 'read' 更改为
read: {
url:'/odata/people',
dataType: 'json'
}
parameterMap 应在传输级别定义(请参阅 kendo documentation)。在您的代码中,您确实在数据源级别定义了 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.
});