Grid 剑道-网格-与复杂对象聚合

Grid 剑道-网格-与复杂对象聚合,grid,aggregate,kendo-ui,complextype,Grid,Aggregate,Kendo Ui,Complextype,我有一个剑道UI网格。网格有一个包含复杂对象数据的数据源。例如,{“foo”:{“bar”:10}。尽管column字段可以在对象图(即foo.bar)中导航,但aggregate字段似乎无法导航 代码如下: var grid = $("#grid").kendoGrid({ dataSource: { data: [ {"foo": {"bar": 10}}, {"foo": {"bar": 20}} ],

我有一个剑道UI网格。网格有一个包含复杂对象数据的数据源。例如,{“foo”:{“bar”:10}。尽管column字段可以在对象图(即foo.bar)中导航,但aggregate字段似乎无法导航

代码如下:

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");
这是小提琴:

Firebug在kendo.all.min.js的第8行报告“TypeError:data.foo未定义”


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

不可能在聚合中包含复杂对象,因为用于计算它的动态生成函数认为
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\u bar
,并将其用于聚合。

这里是剑道支持部门提供的“更好”anwser:

您正在经历的行为是由于您指定的“路径”将用作聚合结果创建的映射中的键。生成类似于以下内容的对象:

{“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");

这是正确的。服务器返回一个大型复杂对象。我只能展平聚合中所需的列。虽然有很多列,而且数据集可能很大,但听起来平坦化是唯一的方法(或者在footerTemplate中使用函数并在该函数中构建我自己的聚合)。谢谢你的帮助。