D3 强制布局 Tick Fn - nodes.attr() 不是一个函数
D3 Force Layout Tick Fn - nodes.attr() is not a function
我开始玩D3 Force Layout
,我被困在添加元素并重新开始计算中。
继续获得: Uncaught TypeError: network.nodes.attr is not a function
这是我的代码:
var topoConfig = {
width: 600,
height: 600
};
var network = {
nodes: [],
links: []
}
var tickFn = () => {
network.nodes
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
network.links
.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
};
var svg = d3.select("body")
.append('svg')
.style('width', topoConfig.width + 'px')
.style('height', topoConfig.height + 'px');
var force = d3.layout.force()
.nodes(network.nodes)
.links(network.links)
.charge(-400)
.linkDistance(80)
.size([topoConfig.width, topoConfig.height])
.on('tick', tickFn);
function reload(){
var nodes = svg.selectAll('.node')
.data(network.nodes, d => d.id);
nodes.enter()
.append('rect')
.attr({
width: 10,
height: 10,
x: function(d){return d.x},
y: function(d){return d.y}
});
force.start();
}
function addNode(node){
network.nodes.push(node);
reload();
}
window.setTimeout(function(){
addNode({
"id": "fabric:a",
"label": "Fabric Switch",
"type": "fabric-switch",
"x": 100,
"y": 100
});
}, 500)
这是小提琴:https://jsfiddle.net/teone/wo2gv3ge/3/
知道我做错了什么吗?
谢谢
正如Lars在评论中提到的,attr
方法在d3选择中可用,而不是在JavaScript数组中可用。
因此,您必须替换如下所示的即时报价函数。
var tickFn = () => {
svg.selectAll('.node') //Where node is the class name of node elements.
.attr("x", function(d) { return d.x; })
.attr("y", function(d) { return d.y; });
svg.selectAll('.link') //Where link is the class name of link elements.
.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
};
注意:您似乎正在使用rect
来重新发送节点。如果节点是rect
元素,则应更新节点的x
和y
属性,而不是cx
和cy
属性。(如果节点是圆元素,请使用cx
、cy
属性)
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 我可以在json对象中添加一个函数吗
- Javascript使函数一个接一个地执行
- 是JavaScript中的函数一个对象
- 两个几乎相等的jQuery函数;一个适用于IE,一个不适用于IE
- 两个Javascript函数一个window.onload=Custom.init;和一个window.onload=f
- 使javascript加载函数一个接一个地执行
- 如何通过两个嵌套的匿名函数(一个带有超时的事件处理程序)传递变量
- 为什么我不能让两个jQuery函数一个在另一个里面呢?
- 给函数一个变量名,而不是它的值
- 如何使用嵌入函数(一个滚动页由Pete - peachananr)
- 是否有可能给JavaScript函数一个类型/类?
- 确保两个函数一个接一个地执行,其中第一个函数内部有一个异步调用
- 两个不同的ajax函数一个接一个调用返回相同的值
- jQuery第一次更改函数一个工作
- 给这个函数一个id
- 如何给回调函数一个值一个变量在特定时刻
- 使用回调使两个函数一个接一个地运行
- 两个函数(一个用php)是否可以用“;onclick”;
- 两个几乎相同的函数.一个函数用Queue进行排队.Jquery效果在queued函数上不起作用.为什么