可以使用JSON发送javascript函数吗?

时间:2011-10-11 00:11:21

标签: javascript ajax json callback highcharts

我正在使用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发回回调的方式:手动输出JSON的Twig模板引擎 - 没有json_encode(不工作):

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

使用jQuery进行JSON解析时没有错误。我管理员我不是javascript也不是jQuery大师...感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

您的twig模板中的函数将输出为字符串而不是函数。

$.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 :(得分:1)

您无法使用JavaScript / JSON序列化函数。

答案 2 :(得分:0)

我没有从服务器请求整个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