我有一个控制器,我设法从数据库返回一个数据列表。此数据将传递给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
总有一天,我会按照我想要的方式找到合适的解决方案......太糟糕了。
答案 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