我正在基于GPS跟踪收集的驾驶员行为来构建追溯工具。该工具将限制用户仅查看分配给他们的组织。每层显示一个图表(CanvasJs)。单击图表部分可深入到新图表。图层从0(顶部)开始,当前从3(底部)结束
第3层当前引起问题。
更改日期将强制刷新。
$('#processDate').change(function(e) {
param.datePassedIn = e.target.value;
doAjax(layer.current);
});
第3层实际上没有使用日期。它仅需要eventId。这就是事件保持不变的原因。
第3层图表选项
所有图表选项都在一个数组对象中,索引是图层ID。
var chartOptions = [
{
[snip]
},
{
[snip]
},
{
[snip]
},
{ //layer 3
cursor: "pointer",
title: {
text: orgCode + " Events",
fontSize: 30
},
subtitles: [{
text: "{EventType} Events {EventId} for Driver {DriverId}", // this comes from the MVC now
fontSize: 15
}],
axisY: {
title: "Speed",
stripLines: {},
minimum: 0,
maximum: 130
},
axisX: {
title: "Time",
labelAngle: 90,
labelAutoFit: false,
interval: 1,
intervalType: "minute",
valueFormatString: "HH:mm:ss",
minimum: periodStart,
maximum: periodEnd
},
data: [
{
type: "line",
//click: layer3ClickHandler, //we're not clicking down. at the bottom.
dataPoints: []
}
]
}
];
ajaxOptionas和doAjax函数
var ajaxOptions = [
{
url: "DriverBehaviour/GetLayer0",
callback : layer0CallbackHandler
},
{
url: "DriverBehaviour/GetLayer1",
callback : layer1CallbackHandler
},
{
url: "DriverBehaviour/GetLayer2",
callback : layer2CallbackHandler
},
{
url: "DriverBehaviour/GetLayer3",
callback : layer3CallbackHandler
}
];
//AJAX call based on current layer. Returns to designated callback handler (in options)
function doAjax(layerIndex) {
logObjectAsJson(ajaxOptions[layerIndex], "ajaxOptions[" + layerIndex + "]");
logObjectAsJson(param, "param");
hideErrorText();
$.ajax({
type: "GET",
cache: false,
dataType: "json",
url: ajaxOptions[layerIndex].url,
data: param,
success: function (response) {
showErrorText(response);
ajaxOptions[layerIndex].callback(response);
},
complete : function () {
console.log("Ajax call complete");
}
});
}
第3层回调处理程序
它的工作是为图表准备任何数据,以及其他任何渲染选项。它还会发出一个HTML列表和表格。
function layer3CallbackHandler(data) {
console.log("func start layer3CallbackHandler");
console.log("Current Layer: " + layer.current);
/******** Prepare chart **********/
chartOptions[layer.current].axisX.minimum = formatDateInputLong(new Date(data.periodStart));
console.log("min date: " + chartOptions[layer.current].axisX.minimum);
chartOptions[layer.current].axisX.maximum = formatDateInputLong(new Date(data.periodEnd));
console.log("max date: " + chartOptions[layer.current].axisX.maximum);
chartOptions[layer.current].data[0].dataPoints = [];
$.each(data.dataPoints, function (key, value) {
chartOptions[layer.current].data[0].dataPoints.push({
label: value["label"],
x: new Date(value["Xdate"]),
y: value["y"],
color: value["color"],
name: value["name"]
});
});
chartOptions[layer.current].subtitles[0].text = data.chartSubTitle;
chart = new CanvasJS.Chart("chartContainer", chartOptions[layer.current]);
logObjectAsJson(chart, "chart");
chart.render();
$("#processDate").disabled = true; //disable the date picker - date not used on layer 3
$("#backButton").show();
$("#tableContainer").empty();
$("#tableContainer").append("<h2>Event Details</h2>");
layer3emitList(data.tableData[0]);
layer3emitTable(data.tableData);
console.log("func end layer3CallbackHandler");
}
图表对象
这是在渲染之前记录的图表对象。它是chartOptions[3]
和从Ajax查询返回并合并到layer3CallbackHandler
chart
{
"options": {
"cursor": "pointer",
"title": {
"text": "HVO Events",
"fontSize": 30
},
"subtitles": [
{
"text": "Driving w/o Seatbelt Event 4484051 for Driver Wayne Hicks",
"fontSize": 15
}
],
"axisY": {
"title": "Speed",
"stripLines": {},
"minimum": 0,
"maximum": 130
},
"axisX": {
"title": "Time",
"labelAngle": 90,
"labelAutoFit": false,
"interval": 1,
"intervalType": "minute",
"valueFormatString": "HH:mm:ss",
"minimum": "2019-12-01 06:50:41",
"maximum": "2019-12-01 06:53:05"
},
"data": [
{
"type": "line",
"dataPoints": [
{
"label": "Start up",
"x": "2019-11-30T19:50:41.000Z",
"y": 0,
"color": "black",
"name": "06:50:41"
},
{
"label": "Seatbelt; (GPS Unlock)",
"x": "2019-11-30T19:50:43.000Z",
"y": 0,
"color": "black",
"name": "06:50:43"
},
{
"label": "Seatbelt; (GPS Unlock)",
"x": "2019-11-30T19:50:45.000Z",
"y": 0,
"color": "black",
"name": "06:50:45"
},
{
"label": "Seatbelt",
"x": "2019-11-30T19:50:50.000Z",
"y": 0,
"color": "black",
"name": "06:50:50"
},
{
"label": "Seatbelt",
"x": "2019-11-30T19:50:55.000Z",
"y": 15,
"color": "red",
"name": "06:50:55"
},
{
"label": "Seatbelt",
"x": "2019-11-30T19:51:00.000Z",
"y": 19,
"color": "red",
"name": "06:51:00"
},
{
"label": "Seatbelt",
"x": "2019-11-30T19:51:05.000Z",
"y": 14,
"color": "red",
"name": "06:51:05"
},
{
"label": "Driving",
"x": "2019-11-30T19:51:10.000Z",
"y": 28,
"color": "black",
"name": "06:51:10"
},
{
"label": "Driving",
"x": "2019-11-30T19:51:15.000Z",
"y": 22,
"color": "black",
"name": "06:51:15"
},
{
"label": "Driver Tag Presented",
"x": "2019-11-30T19:51:15.000Z",
"y": 22,
"color": "black",
"name": "06:51:15"
},
{
"label": "Driving",
"x": "2019-11-30T19:51:20.000Z",
"y": 40,
"color": "black",
"name": "06:51:20"
},
{
"label": "Driving",
"x": "2019-11-30T19:51:25.000Z",
"y": 46,
"color": "black",
"name": "06:51:25"
},
{
"label": "Driving",
"x": "2019-11-30T19:51:30.000Z",
"y": 35,
"color": "black",
"name": "06:51:30"
},
{
"label": "Driving",
"x": "2019-11-30T19:51:35.000Z",
"y": 49,
"color": "black",
"name": "06:51:35"
},
{
"label": "Driving",
"x": "2019-11-30T19:51:40.000Z",
"y": 39,
"color": "black",
"name": "06:51:40"
},
{
"label": "Driving",
"x": "2019-11-30T19:51:44.000Z",
"y": 28,
"color": "black",
"name": "06:51:44"
},
{
"label": "Driving",
"x": "2019-11-30T19:51:45.000Z",
"y": 28,
"color": "black",
"name": "06:51:45"
},
{
"label": "Driving",
"x": "2019-11-30T19:51:50.000Z",
"y": 23,
"color": "black",
"name": "06:51:50"
},
{
"label": "Driving",
"x": "2019-11-30T19:51:55.000Z",
"y": 42,
"color": "black",
"name": "06:51:55"
},
{
"label": "Driving",
"x": "2019-11-30T19:52:00.000Z",
"y": 55,
"color": "black",
"name": "06:52:00"
},
{
"label": "Driving",
"x": "2019-11-30T19:52:05.000Z",
"y": 55,
"color": "black",
"name": "06:52:05"
},
{
"label": "Driving",
"x": "2019-11-30T19:52:10.000Z",
"y": 49,
"color": "black",
"name": "06:52:10"
},
{
"label": "Driving",
"x": "2019-11-30T19:52:15.000Z",
"y": 53,
"color": "black",
"name": "06:52:15"
},
{
"label": "Driving",
"x": "2019-11-30T19:52:20.000Z",
"y": 53,
"color": "black",
"name": "06:52:20"
},
{
"label": "Driving",
"x": "2019-11-30T19:52:24.000Z",
"y": 34,
"color": "black",
"name": "06:52:24"
},
{
"label": "Driving",
"x": "2019-11-30T19:52:25.000Z",
"y": 29,
"color": "black",
"name": "06:52:25"
},
{
"label": "Driving",
"x": "2019-11-30T19:52:30.000Z",
"y": 35,
"color": "black",
"name": "06:52:30"
},
{
"label": "Driving",
"x": "2019-11-30T19:52:35.000Z",
"y": 39,
"color": "black",
"name": "06:52:35"
},
{
"label": "Driving",
"x": "2019-11-30T19:52:40.000Z",
"y": 38,
"color": "black",
"name": "06:52:40"
},
{
"label": "Driving",
"x": "2019-11-30T19:52:44.000Z",
"y": 31,
"color": "black",
"name": "06:52:44"
},
{
"label": "Driving",
"x": "2019-11-30T19:52:45.000Z",
"y": 31,
"color": "black",
"name": "06:52:45"
},
{
"label": "Driving",
"x": "2019-11-30T19:52:50.000Z",
"y": 27,
"color": "black",
"name": "06:52:50"
},
{
"label": "Driving",
"x": "2019-11-30T19:52:55.000Z",
"y": 23,
"color": "black",
"name": "06:52:55"
},
{
"label": "Driving",
"x": "2019-11-30T19:53:00.000Z",
"y": 20,
"color": "black",
"name": "06:53:00"
},
{
"label": "Driving",
"x": "2019-11-30T19:53:05.000Z",
"y": 23,
"color": "black",
"name": "06:53:05"
}
]
}
]
}
}
小型控制台日志记录功能
使用JSON.stringify
漂亮地打印到控制台上
function logObjectAsJson(object, name) {
var str;
if (name == undefined) {
str = JSON.stringify(object, null, 4);
}
else {
str = name + "\n" + JSON.stringify(object, null, 4);
}
console.log(str);
}
最后,我将最新的构建部署到this site