Отправка функции JavaScript с помощью JSON возможна? - PullRequest
2 голосов
/ 11 октября 2011

Я использую Highcharts для отображения диаграмм: когда документ готов, запрос ajax извлекает данные (в формате JSON) и инициализирует объект chart с некоторыми данными по умолчанию и некоторыми динамическими данными ( точек):

$('document').ready(function() {

    var chart;

    $.ajax({
        url: "{{ path('stats_update') }}",
        type: "POST",
        dataType: "json",
        success: function(data){
            data.chart.renderTo = 'chart'; // id of the div element
            chart = new Highcharts.Chart(data); // inizialize chart object
        }
    });

}); // end of document.ready

Пока все хорошо, все работает отлично, за исключением случаев, когда мне нужно отправить обратно обратных вызовов . Это не работает, и я не могу найти почему. Диаграмма «зависает» и подсказка не отображается:

Вот как инициализируется обратный вызов функции форматирования (работает):

var chart = new Highcharts.Chart({
    tooltip: {
        formatter: function() { return this.x; }
});

Вот так я отправляю обратный вызов, используя JSON: механизм шаблонов Twig, выводящий JSON, вручную - без json_encode (не работает):

{
   "tooltip" : {
      "formatter" : "function() { return this.x; }"
   }
}

Нет ошибок при разборе JSON с помощью jQuery. Я бы сказал, что я не гуру javascript или jQuery ... спасибо за помощь.

Ответы [ 3 ]

3 голосов
/ 11 октября 2011

функция из вашего шаблона ветки выводится в виде строки вместо функции.

$.ajax({
    url: "{{ path('stats_update') }}", 
    type: "POST", 
    dataType: "json",
    success: function(data){
        data.chart.renderTo = 'chart'; // id of the div element
        data.tooltip.formatter = eval('(' + data.tooltip.formatter + ')');
        chart = new Highcharts.Chart(data); // inizialize chart object
    }
});
1 голос
/ 11 октября 2011

Нельзя сериализовать функцию с помощью JavaScript / JSON.

0 голосов
/ 12 октября 2011

Вместо того, чтобы запрашивать весь объект options с сервера, я бы запрашивал только данные и создавал диаграмму следующим образом -

$('document').ready(function() {

    var chart;

    $.ajax({
        url: "{{ path('stats_update') }}",
        type: "POST",
        dataType: "json",
        success: function(data){ // <--- send just the data array from server

            chart = new Highcharts.Chart({
                chart: {
                    renderTo: 'chart'; // id of the div element
                },
                //...                    
                tooltip: {
                    formatter: function() { 
                        return this.x; 
                    }
                },
                //...
                series: [{
                    data: eval('(' + data + ')')
                }]
            }); // inizialize chart object
        }
    });

}); // end of document.ready
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...