我有一个Kendo UI网格。网格具有包含复杂对象数据的数据源。例如,{“foo”:{“bar”:10}}。虽然列字段可以导航对象图(即foo.bar),但聚合字段似乎无法进行。
以下是代码:
var grid = $("#grid").kendoGrid({
dataSource: {
data: [
{"foo": {"bar": 10}},
{"foo": {"bar": 20}}
],
aggregate: [
{field: "foo.bar", aggregate: "sum"}
]
},
columns: [
{
field: "foo.bar",
footerTemplate: "Sum: #= sum # "
}
]
}).data("kendoGrid");
这是小提琴: http://jsfiddle.net/e6shF/1/
Firebug在kendo.all.min.js的第8行报告“TypeError:data.foo is undefined”。
我做错了什么吗?如果这是剑道中的一个错误,有没有办法解决这个问题?我必须保持对象的复杂性。
答案 0 :(得分:4)
这是来自剑道支持的“更好”的回音:
您遇到的行为是由于您指定的“路径”将用作作为聚合结果创建的地图中的键的事实。生成类似于以下内容的对象:
{“foo.bar”:{sum:30}}
不幸的是,页脚模板生成不支持此构造,并且无法正确解析。此方案的可能解决方法是使用函数。我已修改样本以说明这一点。
var grid = $("#grid").kendoGrid({
dataSource: {
data: [
{"foo": {"bar": 10}},
{"foo": {"bar": 20}}
],
aggregate: [
{field: "foo.bar", aggregate: "sum"}
]
},
columns: [
{
field: "foo.bar",
footerTemplate: function(data) { return "Sum: " + data["foo.bar"].sum; }
}
]
}).data("kendoGrid");
答案 1 :(得分:1)
由于动态生成的用于评估它的函数,聚合中不可能有复杂对象,认为foo.bar
是字段的名称(只有一个字段)?
你真的需要那个复杂的领域吗?
我可能会理解服务器(提供网格数据)会发送复杂的foo
,但您始终可以使用parse
或data
展平它数据源中的函数。像这样:
var grid = $("#grid").kendoGrid({
dataSource:{
data:[
{"foo":{"bar":10}},
{"foo":{"bar":20}}
],
aggregate:[
{field:"foo_bar", aggregate:"sum"}
],
schema: {
parse:function (data) {
var res = [];
$.each(data, function (idx, elem) {
res.push({ "foo_bar":elem.foo.bar })
});
return res;
}
}
},
columns: [
{
field: "foo_bar",
footerTemplate:"Sum: #= sum # "
}
]
}).data("kendoGrid");
我将收到的foo.bar
转换为foo_bar
并将其用于汇总。