2011-02-04 6 views
2

Я пытаюсь форматировать jQuery DataTable с помощью json, хранящегося в базе данных. Я передаю json клиенту в скрытом поле в ответе. Затем я попробовать инициализацию DataTable со следующими ЯШАМИ:jQuery datatables json initialisation invalid json

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 (я просто скопировал SQL, который я использую, чтобы заполнить таблицу JSON инициализации в БДЕ:

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' 

следующая строка выходит из строя (с I nvalid JSON ошибка):

var json = $.parseJSON(jsoninittext); 

и поэтому второе предупреждение (точка два) никогда не работает, поэтому он не получает функцию DataTable(). Мне кажется, что определение функции (содержащее фигурные скобки) приводит к тому, что json недействителен. Кто-нибудь знает, как я мог бы форматировать инициализацию jat для данных, чтобы он мог продолжать содержать определение функции, как ожидается, с помощью jQuery datatables, но это все равно будет действительным json (есть ли способ сортировки, который я мог бы использовать)? Большое спасибо.

ответ

1

Сериализация JSON не предназначена для хранения функций. JSON, по своей природе, является способом сериализации элементов данных внутри объекта, а не его внутренних процессов. См. http://www.json.org/ под заголовком «значение» (три цифры вниз), чтобы узнать, какие объекты предназначены для сериализации с использованием JSON.

Вы можете заключить эту функцию в кавычки, чтобы принудительно вставить ее в строку и запустить eval в этом элементе данных, но я обычно не рекомендую разработчикам использовать eval().

+0

Большое спасибо за информацию, я закодировал проблему (см. Ниже) – DEH

0

В конце концов, я не мог заставить это работать без eval, чего я хочу избежать. Мое обходное решение заключалось в том, чтобы инкапсулировать функциональность fnRender (где я объединил несколько столбцов в один столбец) в уровень сервера, чтобы сервер объединил столбцы, и поэтому не нужно было использовать fnRender для их объединения. Позор, но ты туда.