jQuery datatables json инициализация недействительна json - PullRequest
2 голосов
/ 04 февраля 2011

Я пытаюсь отформатировать jQuery DataTable, используя json, хранящийся в базе данных. Я передаю 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 (я только что скопировал sql, который я использую для заполнения таблицы инициализации json в db:

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 datatables, но это все еще будет действительный json (есть ли своего рода выход, который я могу использовать)? Большое спасибо.

Ответы [ 2 ]

1 голос
/ 04 февраля 2011

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

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

0 голосов
/ 09 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...