2012-02-07 18 views
9

Ho un oggetto Java in cui l'oggetto persona contiene un oggetto displayName. L'ho convertito in un oggetto JSON per il mio JSP. I dati è simile al seguente:Slickgrid - Definizione di colonna con oggetti complessi

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

voglio legare le mie colonne per le proprietà del nome che risiedono all'interno dell'oggetto displayName, ma io non sono in grado di ottenere la definizione di colonna per riconoscere dove risiedono i dati. Ecco un esempio del mio firstName definizione di colonna:

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

la vista non rendono i nomi, anche se i dati sono lì. È possibile associare una colonna a una proprietà dell'oggetto che risiede in un altro oggetto? In tal caso, cosa sto sbagliando?

+0

Ecco una soluzione generica che funziona per i valori di campo "a punti": http://stackoverflow.com/a/24566666/3445021 – tc7

+0

@ TC7: Tale soluzione utilizza 'eval()', così mentre può funzionare, non è la soluzione migliore. – user128216

risposta

14

Slickgrid non supporta questa funzionalità per impostazione predefinita, ma è possibile aggirare aggiungendo valore estrattore personalizzato per le opzioni oggetto:

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

Il codice viene testato con slickgrid 2.0 e sta lavorando bene. Sfortunatamente sembra che il codice slickgrid sia un po 'incoerente e gli editor non prendono in considerazione questa opzione, quindi questa soluzione è utilizzabile solo se si visualizzano i dati senza modifiche.

+1

Questo era ciò di cui avevo paura. Mi piace il tuo suggerimento e lo farò quando aggiornerò le nostre librerie SlickGrid. I nomi sono modificabili quindi dovrò tornare a un oggetto appiattito che stavo usando prima. Grazie mille per il suggerimento. – user1195089

+0

Non si sa dove dataItemColumnValueExtractor è documentato, ma questa è la risposta corretta a questa domanda. Grazie! – Upperstage

2

So che questo è un po 'vecchio ... ma il mio lavoro è di fare un pre-processo sui miei articoli. In sostanza, appiattendo il modello out:

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

Questo problema sembra essere più di una di un problema di modellazione dei dati però.

+0

Grazie, ha funzionato! –

Problemi correlati