使用数据库中的数据加载canvasjs图表

时间:2014-02-25 13:22:37

标签: jquery coldfusion coldfusion-9 canvasjs

我正在使用 coldfusion 将数据加载到我的饼图中,而不是饼图,我得到 35 datapoints 的列表,并且没有显示图表。

这是我的代码:

<script type="text/javascript">
$(document).ready(function () {
    $.getJSON("display.cfc?method=getData&lob=all", function (result) {
        alert(result);
        var chart2 = new CanvasJS.Chart("piechart", {
            theme: "theme2",
            legend: {
                fontSize: 12,
                horizontalAlign: "right",
                verticalAlign: "center"
            },
            data: [{
                type: "pie",
                showInLegend: true,
                dataPoints: result
            }]
        });
        chart2.render();
    });
});
</script>
<div id="piechart" style="display: inline-block; height: 200px; width: 400px;"></div>

我的coldfusion函数正在返回:

{y: 142, legendtext: "In Progress"}, {y: 1083, legendtext: "New"},{y: 48, legendtext: "Error"} 

这是功能:

<cffunction name="getData" access="remote" returnformat="json">
<cfargument name="lob" type="string" required="yes" />
<cfset var theQuery = getTransitionStatusCounts(#arguments.lob#)>
<cfset var rObj = "">
<cfset var rObjArray = []>

<cfoutput query="theQuery">
    <cfset rObj = '{y: #count#, legendtext: "#status#"}'>
    <cfset arrayAppend(rObjArray, rObj)>
</cfoutput>

<cfreturn rObjArray>

</cffunction>

还有其他人有这个问题吗?

3 个答案:

答案 0 :(得分:2)

2件事。
1.数据点需要在数组中 2.按原样使用coldfusion的json。不要在cfc中手动创建json

$(document).ready(function () {
   $.getJSON("display.cfc?method=getData&lob=all", function (result) {       
      dp = [];
      for(var i = 0 ; i< result.DATA.length; i++){
          dp.push({y: result.DATA[i][0], label: result.DATA[i][1]})};       
      var chart2 = new CanvasJS.Chart("piechart", {
        theme: "theme2",
        data: [{
            type: "pie",
            dataPoints: dp }]});
        chart2.render();});});

这就是我在cfc中所拥有的

<cfcomponent access="remote">
<cffunction name="getData" access="remote" returnformat="json">
    <cfargument name="lob" type="string" required="yes" />
    <cfset var myQuery = QueryNew("y,label")/>
    <cfset QueryAddRow(myQuery,3) />

    <cfset QuerySetCell(myQuery, "y" , 142,1) />
    <cfset QuerySetCell(myQuery, "label" , "In Progress", 1) />

    <cfset QuerySetCell(myQuery, "y" , 1083,2) />
    <cfset QuerySetCell(myQuery, "label" , "New",2) />

    <cfset QuerySetCell(myQuery, "y" , 48,3) />
    <cfset QuerySetCell(myQuery, "label" , "Error",3) />

    <cfreturn myQuery/>    
  </cffunction>
</cfcomponent>

答案 1 :(得分:2)

问题是您正在使用returnformat="json"混合手动构造的JSON字符串。因此,当CF对数组进行编码时,它不知道数组元素已经编码(部分地),并将元素视为字符串,从而转义现有的引号。所以最终结果不是JSON中的结构数组,即结果如下:

  [ "{y: 142, legendtext: \"In Progress\"}",.... ]

...而不是:

  [ {"y":142, "legendtext":"In Progress"},....]

您无需滚动自己的JSON。只需创建一个结构数组,CF将完成剩下的工作:

    ...
    <cfoutput query="theQuery">
        <!--- use structure notation to preserve case --->
        <cfset rObj = {} />
        <cfset rObj["y"] = count />
        <cfset rObj["legendtext"] = status />
        <cfset arrayAppend(rObjArray, rObj)>
    </cfoutput>

    <cfreturn rObjArray>

此外,为了获得更大的灵活性,您可以让函数返回一个普通数组,然后在从jQuery调用.cfc时使用参数?returnformat=json指定JSON格式。

答案 2 :(得分:0)

您的json数据格式不正确 - 数组应包含在[]中,变量用引号括起来。尝试输出以下JSON - 只需要一个刺痛连接就可以适用于你的情况。

[{"y": 142, "legendtext": "In Progress"}, {"y": 1083, "legendtext": "New"},{"y": 48, "legendtext": "Error"}]