2012-02-07 52 views
9

我有一个Java对象,其中person对象包含一个displayName对象。我已将它转换为我的JSP的JSON对象。数据如下所示:Slickgrid - 复杂对象的列定义

var people = [ 
{"id":52959,"displayName":{"firstName":"Jim","lastName":"Doe","middleName":"A"},"projectId":50003,"grade":"8","statusCode":"A","gradYear":2016,"buyer":false}, 
{"id":98765,"displayName":{"firstName":"Jane","lastName":"Doe","middleName":"Z"},"projectId":50003,"grade":"8","statusCode":"A","gradYear":2016,"buyer":true} 
]; 

我想我的列绑定到驻留在显示名对象中,该名称的属性,但我不能让列定义认识到数据所在。以下是我的名字列定义的一个示例:

{id: 'displayName.firstName', field: 'displayName.firstName', name: 'First Name', 
width: 110, sortable: true, editor: TextCellEditor, formatter: SpaceFormatter,    
cssClass: '', maxLength: 250, editable: true} 

尽管数据存在,但视图并不显示名称。是否可以将列绑定到驻留在另一个对象内的对象属性?如果是这样,我做错了什么?

+0

这里有一个通用的解决方案,为“点”的字段值的工作原理: http://stackoverflow.com/a/24566666/3445021 – tc7 2014-07-04 04:29:52

+0

@ TC7:该解决方案采用'的eval()',所以虽然它可能工作,这不是最好的解决方案。 – user128216 2016-05-17 18:12:30

回答

14

Slickgrid默认情况下不支持此功能,但你可以通过添加自定义值提取到你的选择变通办法,对象:

var options = { 
    dataItemColumnValueExtractor: function(item, columnDef) { 
    var names = columnDef.field.split('.'), 
     val = item[names[0]]; 

    for (var i = 1; i < names.length; i++) { 
     if (val && typeof val == 'object' && names[i] in val) { 
     val = val[names[i]]; 
     } else { 
     val = ''; 
     } 
    } 

    return val; 
    } 
} 

var grid = new Slick.Grid($("#slickgrid"), data, columns, options); 

的代码与slickgrid 2.0测试工作就好了。不幸的是,slickgrid代码有点不一致,编辑器也没有考虑到这个选项,所以这个解决方案只有在你没有编辑的情况下显示数据时才可用。

+1

这就是我所害怕的。我喜欢你的建议,当我升级我们的SlickGrid库时,我会放弃它。名称是可编辑的,所以我将不得不退回到之前使用的扁平物体。非常感谢这个建议。 – user1195089 2012-02-09 17:06:51

+0

不确定dataItemColumnValueExtractor在哪里被记录,但这是这个问题的正确答案。谢谢! – Upperstage 2014-08-15 11:29:33

2

我知道这有点旧...但我的工作是对我的物品做一个预处理。基本上,模型展平:

var preProcessItems = function (items) { 
    var newItems = []; 
    for (var i = 0; i < items.length; i++) { 
    var item = items[i]; 
    item['firstName'] = item['displayName']['firstName']; 
    newItems[i] = item; 
    } 
    return newItems; 
}; 

/// when the value is updated on the flat structure, you can edit your deep value here 
var fNameFormatter = function (row, cell, value, columnDef, dataContext) { 
    // datacontext.displayName.firstName = value; 
    return value ? value : ""; 
}; 

虽然这个问题似乎是更多的数据建模问题。

+0

谢谢,这工作! – 2015-04-17 17:28:58