2012-11-14 52 views
2

我有一个Kendo UI网格。网格具有包含复杂对象数据的数据源。例如,{“foo”:{“bar”:10}}。尽管列字段可以导航对象图(即foo.bar),但聚合字段似乎不能。Kendo - 网格 - 与复杂对象聚合

下面的代码:

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的报告 “类型错误:data.foo是未定义” 在kendo.all.min.js的8行。

我做错了什么吗?如果这是Kendo中的错误,是否有办法解决这个问题?我必须保持对象复杂。

回答

4

下面是剑道支持一个“更好” anwser:

遇到由“路径”您指定将用作作为的结果,创造了地图的一个关键的事实引起的行为聚合。生产类似如下的对象:

{“foo.bar”:{总和: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

由于动态生成的函数用于评估它,因此不可能在聚合中包含复杂的对象,认为foo.bar是该字段的名称(只有一个字段)?

你真的需要那个复杂的领域吗?

我可能了解服务器(提供网格的数据)发送一个复杂的foo,但你可以使用它在数据源parsedata功能总是压扁。事情是这样的:

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.barfoo_bar,并使用这个聚集。

+0

没错。服务器返回一个大的复杂对象。我只能拼合聚合所需的列。尽管它有很多列,并且数据集可能很大,但听起来像扁平化是唯一的方法(或者可以在footerTemplate中使用函数并在该函数中构建我自己的聚合)。谢谢你的帮助。 – James