2012-02-07 9 views
9

Tengo un objeto Java donde el objeto persona contiene un objeto displayName. Lo he convertido en un objeto JSON para mi JSP. Los datos tiene el siguiente aspecto:Slickgrid - Definición de columna con objetos complejos

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} 
]; 

quiero unir mis columnas a las propiedades del nombre que residen dentro del objeto de idioma, pero yo soy no puede obtener la definición de columna a reconocer dónde residen los datos. He aquí un ejemplo de mi definición de la columna nombre:

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

La vista no hace que los nombres, aunque los datos están ahí. ¿Es posible enlazar una columna a una propiedad de objeto que reside dentro de otro objeto? Si es así, ¿qué estoy haciendo mal?

+0

Aquí es una solución genérica que trabaja para "puntos" valores de campo: http://stackoverflow.com/a/24566666/3445021 – tc7

+0

@ TC7: Esta solución utiliza 'eval()', lo que si bien puede funcionar, no es la mejor solución. – user128216

Respuesta

14

Slickgrid no soporta esta capacidad de forma predeterminada, pero se puede solucionar mediante la adición de extractor de valor personalizado a sus opciones objetar:

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); 

El código se prueba con slickgrid 2.0 y está funcionando muy bien. Lamentablemente, parece que el código slickgrid es un poco inconsistente y los editores no tienen en cuenta esta opción, por lo que esta solución solo se puede usar si va a mostrar los datos sin editarlos.

+1

Eso era lo que temía. Me gusta su sugerencia y la probaré cuando actualice nuestras bibliotecas SlickGrid. Los nombres son editables, así que tendré que recurrir a un objeto aplanado que estaba usando antes. Muchas gracias por la sugerencia. – user1195089

+0

No estoy seguro de dónde está documentado el DataItemColumnValueExtractor, pero esta es la respuesta correcta a esta pregunta. ¡Gracias! – Upperstage

2

Sé que esto es un poco viejo ... pero mi trabajo es hacer un pre-proceso en mis artículos. Básicamente, aplanando el modelo:

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 : ""; 
}; 

Sin embargo, este problema parece ser más un problema de modelado de datos.

+0

¡Gracias, esto funcionó! –

Cuestiones relacionadas