我正在尝试使用数据库中保存的json格式化jQuery DataTable。我将json传递给响应中隐藏字段中的客户端。然后我尝试使用以下js初始化数据表:
function initDataTables(){
$('.datatable').each(function(i) {
// Look for a hidden field containing the json to use when initialising the datatable
var hiddenfieldkey = $(this).attr('id') + 'jsoninit'
var hiddenfield = $('#' + hiddenfieldkey);
if (hiddenfield.length > 0) {
// We have found some 'special' json formatting, so use it
var jsoninittext = $(hiddenfield).val();
alert(jsoninittext);
var json = $.parseJSON(jsoninittext);
alert('point two');
$(this).dataTable(json);
}
else {
// Standard datatable formatting
$(this).dataTable({
"bJQueryUI": true,
"sPaginationType": "full_numbers",
"aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
});
}
});
initDataTableButtons();
}
这一切都适用于以下json(我刚刚复制了用于填充db中的json init表的sql:
update query set jQueryDatatableJSONInit=
'{
"iDisplayLength": 25
,"bJQueryUI": true
,"sPaginationType": "full_numbers"
,"aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
,"aoColumnDefs": [
{ "bVisible": false, "aTargets": [ 0,3,4 ] }
,{ "sClass": "nowrap", "aTargets": [ 2 ] }
,{ "iDataSort": 0, "aTargets": [ 1 ] }
,{ "bSortable": false, "aTargets": [ 2 ] }
]
}'
where id ='336f7ea2-173a-4b8f-af30-e217d1e1c628'
但是,当我的json包含一个函数时出现问题,如下所示(与之前相同,但包含一个包含函数的fnRender行):
update query set jQueryDatatableJSONInit=
'{
"iDisplayLength": 25
,"bJQueryUI": true
,"sPaginationType": "full_numbers"
,"aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
,"aoColumnDefs": [
{ "fnRender": function ( oObj ) { return oObj.aData[2] +'' ''+ oObj.aData[3]+'' ''+ oObj.aData[4];},"aTargets": [ 2 ]}
,{ "bVisible": false, "aTargets": [ 0,3,4 ] }
,{ "sClass": "nowrap", "aTargets": [ 2 ] }
,{ "iDataSort": 0, "aTargets": [ 1 ] }
,{ "bSortable": false, "aTargets": [ 2 ] }
]
}'
where id ='336f7ea2-173a-4b8f-af30-e217d1e1c628'
以下行失败(出现无效的JSON错误):
var json = $.parseJSON(jsoninittext);
所以第二个警报(第二点)从不运行,所以它没有到达dataTable()函数。它看起来好像函数定义(包含大括号)导致json无效。 有谁知道我如何格式化数据表初始化json,以便它可以继续包含jquery数据表所期望的函数定义,但这仍然是有效的json(我可以使用哪种类型的转义)? 非常感谢。
答案 0 :(得分:1)
JSON序列化不适用于存储功能。就其本质而言,JSON是一种序列化对象内数据成员的方式,而不是其内部进程。请参阅“值”标题下的http://www.json.org/(向下三个数字),以查看使用JSON进行序列化的对象。
您可以将函数括在引号中以强制它进入字符串并在该数据成员上运行eval,但我通常不会鼓励开发人员使用eval()。
答案 1 :(得分:0)
最后,如果没有eval,我无法让它工作,我想避免。我的解决方法是将fnRender功能(我将几列组合成一列)封装到服务器层中,以便服务器组合列,因此无需使用fnRender来组合它们。很遗憾,但你去了。