在将数据从数据库中获取的数据分配给javascript中的变量时,ajax存在问题

时间:2015-02-18 22:01:01

标签: javascript jquery ajax json

我有一个控制器,我设法从数据库返回一个数据列表。此数据将传递给d3.js饼(shown here)。我得到了所需格式的数据:

[{Nombre:'Investigador asociado C TC',freq:{NivelI:3,NivelII:0,NivelIII:0,SinSNI:7}},{Nombre:'Investigador emérito',freq:{NivelI:0,NivelII:0,NivelIII:3,SinSNI:2}},{Nombre:'Investigador titular A TC',freq:{NivelI:6,NivelII:0,NivelIII:1,SinSNI:3}},{Nombre:'Investigador titular B TC',freq:{NivelI:5,NivelII:10,NivelIII:3,SinSNI:1}},{Nombre:'Investigador titular C TC',freq:{NivelI:2,NivelII:16,NivelIII:20,SinSNI:3}},{Nombre:'Profesor titular B TC',freq:{NivelI:0,NivelII:0,NivelIII:0,SinSNI:1}}];

他们在此d3.js示例中使用的以下部分示例数据如下:

    [
      {State:'AL',freq:{low:4786, mid:1319, high:249}},
      {State:'AZ',freq:{low:1101, mid:412, high:674}}
    ]

是的,正如您所看到的,它看起来不像是正确的JSON格式。查看 freq 变量,它有一个细分字符串,它将 low mid high 变量相加。那么这个数据细分是否会使这个数组看起来不正确?是一种json格式?

奇怪的是,如果我在javascript文件中复制并粘贴该数据字符串,则会显示饼图。但是,如果我通过ajax获得相同的数据,它不起作用!几个星期以来,我一直在努力。如果它是相同的数据字符串,那么为什么不显示饼图???

以下是代码:

$(document).ready(function() {
   $.ajax({
      url: '{{URL::route("query02")}}',
      type: 'GET',
      async: true,
      dataType: "json",//tried html, text, everything, ...
      success: function(datos,status, XHR) {
          console.log(datos);
          /*if i call datos and put the string here, It does work. For example:
          var datos=[{Nombre:'Investigador asociado C TC', ... NivelIII:0,SinSNI:1}}]; */
          /*Calling the pie chart function*/
          dashboard('#dashboard',datos);
      }
    });
});

我已经尝试了其他问题中的所有内容:stringify,jsonParse,html,text等! :/

备注:我试过了

dataType='json'
dataType="json"
dataType='html'
dataType='text'

我注意到的是,当dataType ='json'时,console.log(datos)不会显示任何内容。

此外,javascript收到错误:

  

TypeError:fData.forEach不是函数

其中:

fData.forEach(function(d){d.total=d.freq.NivelI+d.freq.NivelII+d.freq.NivelIII+d.freq.SinSNI;});

所以看起来从ajax收到的数据不是一个数组?或者还有什么东西可以让javascript变得可读?

我缺少什么?我该如何解决这个问题?

半固定 我以非正统的方式解决了: 我使用:

将结果打印到php控制器的.js文件中
file_put_contents('js/pathtomy/file.js',$contents);

内容如下:

var freqData=[{Nombre:'Investigador asociado C TC',freq:{NivelI:3,NivelII:0,NivelIII:0,SinSNI:7}},{Nombre:'Investigador emérito',freq:{NivelI:0,NivelII:0,NivelIII:3,SinSNI:2}},{Nombre:'Investigador titular A TC',freq:{NivelI:6,NivelII:0,NivelIII:1,SinSNI:3}},{Nombre:'Investigador titular B TC',freq:{NivelI:5,NivelII:10,NivelIII:3,SinSNI:1}},{Nombre:'Investigador titular C TC',freq:{NivelI:2,NivelII:16,NivelIII:20,SinSNI:3}},{Nombre:'Profesor titular B TC',freq:{NivelI:0,NivelII:0,NivelIII:0,SinSNI:1}}];
        alert(freqData);
        dashboard('#dashboard',freqData);

在视图中,我将此文件称为:

<script src="{{URL::asset('js/pathtomy/file.js')}}"></script>

它工作正常。 ☺

是的,我知道这是多余的......不过我希望我能够妥善解决它。 没有人可以帮忙:/没关系。此外,我得到了投票。 Buuu

总有一天,我会按照我想要的方式找到合适的解决方案......太糟糕了。

1 个答案:

答案 0 :(得分:0)

由于您确定获得了正确的Javascript代码,因此您只需使用 eval method

var response = "[{Nombre:'Investigador asociado C TC',freq:{NivelI:3,NivelII:0,NivelIII:0,SinSNI:7}},{Nombre:'Investigador emérito',freq:{NivelI:0,NivelII:0,NivelIII:3,SinSNI:2}},{Nombre:'Investigador titular A TC',freq:{NivelI:6,NivelII:0,NivelIII:1,SinSNI:3}},{Nombre:'Investigador titular B TC',freq:{NivelI:5,NivelII:10,NivelIII:3,SinSNI:1}},{Nombre:'Investigador titular C TC',freq:{NivelI:2,NivelII:16,NivelIII:20,SinSNI:3}},{Nombre:'Profesor titular B TC',freq:{NivelI:0,NivelII:0,NivelIII:0,SinSNI:1}}]";
eval('var freqData='+response);
console.log(freqData[0].Nombre);

输出:

Investigador asociado C TC