2014-12-01 23 views
0

问:如何从Date列中为dojo图创建X轴?用实际数据修改dojo图x轴

我正在尝试为Dojo multiseries折线图的x轴创建自定义addAxis()函数。

传入的JSON数据存储在可观察到的内存dstore,通过从PHP脚本XHR检索到的,看起来像:

{"Date":1415854800,"Pressure1":23.2312,"Pressure2":17,"Pressure3":0,"Pressure4":0}, 
{"Date":1415913460,"Pressure1":25.0123,"Pressure2":17,"Pressure3":0.015,"Pressure4":0},... 

那“日期”字段是通过MySQL的UNIX_TIMESTAMP Unix的具有划时代意义的时间戳()上日期列。它不一定是,但我尝试了很多食谱,这是最新的。

我的自定义函数的样子:

var data = new Memory({data:myjsondata}); 
... 
labelFunc: function(n) { 
    var d = dates.get(n).Date; 
    alert(d); 
} 

“数据”的对象是很好的,只要addSeries而言:addSeries()能正确绘制所有4吨的压力。这是困难的部分。通常。

Dojo图表接受dstore,store和DataTable对象,可能还有其他数据类型,但“API参考”(在其他项目中也称为“简要概述/教程”)仅为这些对象提供了有限的配方,和无用的硬编码数组的例子。

数据对象没有真正记录,我没有时间阅读源代码并找出黑客,此外,似乎有很多过时的数据对象迭代。这很容易迷路,而这正是我所处的位置。

dates.get(n).Date因为'Date'未定义而引发异常。根据我使用的最新文档,这是一种方法。也许。如果此版本的内存dstore对象文档没有错误。

问题:如何从日期列为dojo图表创建X轴?

我可以使数据看起来像任何东西,但X轴需要反映该日期值,该行中的每个其他字段是该日期的Y轴值。

回答

0

诀窍,似乎是一个“id”列添加到JSON MySQL的输出,并且设置id字段在存储器构造经由idProperty内存对象ID,如在这个例子中:

在PHP代码:

... 
$stmt = $conn->prepare("@i := 0"); 
$stmt->execute(); 
$stmt = $conn->prepare("SELECT @i:[email protected]+1 AS id, myDate, myVal1, myVal2 FROM T_BlahBlah"); 
$stmt->execute(); 
$data = $stmt->fetchAll(PDO::FETCH_ASSOC); 

// Might need to convert some "null"s to NULL 
// Toss the "null" strings 
array_walk_recursive($data, function(&$item, $key) { 
    if ($item == 'null' || $item == NULL) $item = NULL; 
}); 
echo json_encode($data, JSON_NUMERIC_CHECK); 

现在,您的JSON是这样的:

[{"id":1,"myDate":"2014-12-01","myVal1":2.22,"myVal2":0.77}, 
{"id":2,"myDate":"2014-12-02","myVal1":4.92,"myVal2":1.14},... 

的JavaScript来抓住这个数据是这样的:

... 
function(ready, Chart, StoreSeries, Claro, Legend, 
     Default, Markers, Tooltip, 
     Magnify, SelectableLegend, 
     Memory, Observable, SimpleQueryEngine, lang, arr, 
     xhr, domConstruct, dom, aspect){ 

     xhr.get({ 
      url: "blahDatum.php", 
      sync: true, 
      handleAs: "json" 
     }).then(function(data){ 
      store = Observable(new Memory({data:data, idProperty:"id"})); 
     }); 

     // Create the chart within it's "holding" node 
     var chart = new dojox.charting.Chart("chartNode"); 

     // Set the theme 
     chart.setTheme(Claro); 

     chart.addPlot("default", { 
      type: Markers, 
      markers: true, 
      interpolate: true, 
      tension: "X" 
     }); 

     chart.addAxis("x", { 
      title: "Date", 
      titleOrientation: "away", 
      includeZero: false, 
      rotation: -30, 
      minorTicks: false, 
      labelFunc: function(n) { 
       var row = store.get(n); 
       if (row !== null && row !== undefined) { 
        var date = new Date(row.Date); 
        return date.toLocaleDateString(); 
       } 
      } 
     }); 
     .... // addSeries, legend, etc 

一旦将idProperty设置在Memory()构造函数中,一切都会被点击到位。

该答案还解释了如何使用数据库中的ISO日期添加X轴。