【发布时间】:2026-01-14 00:50:02
【问题描述】:
我相信我有一个问题,可以通过我缺少的东西很容易地解决,但我似乎看不出实际问题是什么。我有一个应用程序,它每秒返回 5000 个点(1000 个 x,y 点的 5 个数组元素),我想在客户端使用 NVD3 进行更新。这是一个 AngularJS 应用程序,所以我使用 krispos angular-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;
});
有没有人看到这里有明显错误的地方,或者我应该采取不同的做法?有没有我错过的选项?任何帮助都会很棒。
干杯,马特
【问题讨论】:
-
如果是我,我会尝试完全绕过角度范围来处理这种流量,这样就不必执行摘要,让 d3 直接处理数据
-
我没有关注这个查理 - 你是在建议我删除 nvd3 指令吗?
-
是的,您可能需要自己动手。下一段要阅读的代码是
nvd3.lineChart
标签: javascript angularjs nvd3.js angular-nvd3