Kendo - 网格 - 与复杂对象聚合

时间:2012-11-14 22:28:51

标签: grid aggregate kendo-ui complextype

我有一个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”。

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

2 个答案:

答案 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,但您始终可以使用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.bar转换为foo_bar并将其用于汇总。