【发布时间】:2015-10-20 17:30:18
【问题描述】:
我正在编写一个基于 d3.js 的实时图表指令。结构如下:
myDirective.js:
app.directive('myDirective', function(socketio) {
return {
restrict: 'EA',
templateUrl: '../../views/partials/chart.html',
controller: DataController,
link: function(scope, elem, attrs, ctrl) {
scope.Watch = scope.$watch(function() {
return ctrl.data;
}, function(newVal) {
// d3 code part
});
socketio.on(event, function(newdata) {
ctrl.data.push(newdata);
// redraw chart
});
}
};
});
在上面的d3代码部分,我参考了http://bl.ocks.org/gniemetz/4618602。主要代码几乎相同,图表显示良好。
现在我想使用socket.io通过代码更新图表
socketio.on(event, function(newdata) {
ctrl.data.push(newdata);
// redraw chart
});
但不知道如何使用更新后的“ctrl.data”有效地重绘图表。我知道在 Morris.js 中,我们可以通过 '.setData(ctrl.data)' 方法做到这一点,但不知道如何在 d3 中更新。有什么想法吗?
ps:我尝试将上面的d3代码复制/粘贴到这个地方,但是总是报错:“TypeError: t.slice is not a function”
谢谢,
【问题讨论】:
-
我认为调用
myD3Selection.data(newdata)会触发 d3 的插入/更新/删除处理程序 -
想知道什么是 myD3Selection?谢谢@Plato
-
一个 d3 选择是零个或多个 DOM 元素,通常用
li.myDataBoundItems之类的 css 标识。 d3 将数据数组中的一项映射到选择中的每个元素。这可以让您的 DOM 在您更改数据时进行响应式更新。 @mbostock 这里有详细解释bost.ocks.org/mike/selection -
@Plato,虽然这是正确的,但这只是需要的一部分。有关更多信息,请参阅我的答案中的小提琴。
-
@Plato 是的,该网站有帮助。我认为这也是一个有前途的解决方案,让我稍后尝试。谢谢你的帮助,柏拉图。
标签: angularjs node.js d3.js socket.io directive