可以在ValueType.OBJECT类型的数据字段中,直接储存JSON对象。
连接在对象类字段的网格数据单元格中,基本上会显示指定在相关字段的keyPath或keyCallback属性返回的值, 并且如同其他数据类型,可以通过使用ValueColumn.displayCallback而创建显示值。
下列"公司"列是连接在储存如下类型对象的字段上的。
{ name: 'Apple', addr: 'NewYork' }
另外,在相关字段的keyPath中,已指定了"name"。
"销售量/增长率"列和"销售量"列连接在储存如下类型对象的字段上, 并且通过设置keyCallback或指定ValueColumn.displayCallback,将其显示在数据单元格中。
{ amount: '1234', growth: '1.3' }
ds.setFields([{
"fieldName": "sales",
"dataType": "object",
"keyCallback": function (field, value) {
return value.amount + ' / ' + value.growth;
}
},
...
grid.setColumns([{
"fieldName": "sales",
"displayCallback": function (index, value) {
return value.amount;
}
},
...
另外,在这种数据单元格上,用户无法直接修改值,而只能通过另外的输入方式以及GridDataSet.setValue等而进行储存。 这时,储存在数据组的JSON对象的变更内容,只能在对象级别进行确认。 也就是说,即使是获取储存在数据组的对象(getValue)并变更属性后再进行储存(setValue),基本上也不会触发变更事件。 只在发生对象本身的变更时,才会触发变更事件。
如果在下列代码中运行'SetValue',因为不会触发数据组事件,所以变更内容将不会立即反映到网格中, 而如果调用触发变更事件的'SetValueEx',就可以立即反映到网格中。
变更所选"公司"列单元格的值。
对象类列的排序,将会以设置在字段的DataField.compareCallback中返回的比较值为标准而进行设置。 如果没有指定回调,就会以keyCallback返回的值或keyPath指定的对象的属性值而进行排序。
{
"fieldName": "sales",
"dataType": "object",
compareCallback: function (v1, v2) {
return v1.growth - v2.growth;
}
}
当导出Excel时,对象类值如同显示内容,将会以keyPath或keyCallback返回的值为标准, 根据返回值的数据类型和指定在导出选项中的objectCallback等转换方式而进行储存。
DataLudi.exportToExcel(grdMain, {
fileName: "dlgrid.xlsx",
objectCallback: function (row, column, v) {
if (column.name() == 'Sales3') {
return v.amount;
}
return v;
}
});