我相信我有一个问题,可以通过我遗漏的东西很容易地解决,但我似乎看不出实际问题是什么。我有一个应用程序,它每秒返回 5000 个点(1000 个 x,y 点的 5 个数组元素),我想在客户端使用 NVD3 进行更新。这是一个 AngularJS 应用程序,所以我使用 krisposangular-nvd3
指令。但是,它使整个应用程序陷入困境,根据 Chrome 的开发人员工具捕获的时间线,该应用程序似乎要等待d3_timer_step
5-6 秒才能返回。
我认为这个问题是由于我们如何更新数据,但整个问题似乎与实际的 d3 部分有关。客户端的代码是
<nvd3 options="optionsRingdown" data="ringdownAvg" config="{refreshDataOnly:true}"></nvd3>
在控制器中,选项定义如下
$scope.options = {
chart: {
type: 'lineChart',
height: 300,
margin: {
top: 20,
right: 40,
bottom: 60,
left: 75
},
x: function(d) {
return d.x;
},
y: function(d) {
return d.y;
},
useInteractiveGuideline: false,
yAxis: {
tickFormat: function(d) {
return d3.format('0.01f')(d);
},
axisLabel: 'Testing'
},
xAxis: {
tickFormat: function(d) {
return d3.time.format('%X')(new Date(d));
},
rotateLabels: -45
},
transitionDuration: 0,
showXAxis: true,
showYAxis: true
}
};
并且数据在以下模板中定义
var ringdownT = [{
values: [],
key: 'Cell 0'
}, {
values: [],
key: 'Cell 1'
}, {
values: [],
key: 'Cell 2'
}, {
values: [],
key: 'Cell 3'
}, {
values: [],
key: 'Cell 4'
}];
数据通过使用以下方法从服务广播的函数调用更新
function updateCRD(d){
var dataOut = {
"tauData": [],
"rdFit": ringdownT,
"rdAvg":ringdownT
}
for (k = 0; k < d.cell.length; k++) {
dataOut.rdAvg[k].values = d.cell[k].avg_rd;
dataOut.rdFit[k].values = d.cell[k].fit_rd;
}
return dataOut;
}
使用以下方法在广播中调用该函数(以 1 秒为间隔广播)
$scope.$on('dataAvailable', function() {
$scope.data = Data.crd;
var data = updateCRD(Data.crd);
$scope.tauData = data.tauData;
$scope.ringdownAvg = data.rdAvg;
$scope.ringdownFit = data.rdFit;
});
有没有人看到这里看起来明显错误的东西或者我应该做不同的事情?有没有我错过的选项?任何帮助都会很棒。
干杯,马特