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